0

これが私のコードです

internal static  void ValidateUrl(string url)
{
    Uri validUri;
    if(Uri.TryCreate(url,UriKind.Absolute,out validUri))
    {
        using (HttpClient client = new HttpClient())
        {
            try
            {                    
                HttpResponseMessage response = client.Get(url);
                response.EnsureStatusIsSuccessful();
            }
            catch (Exception ex)
            {
                  //exception handler goes here 
            }
        }
    }
}

このコードを実行すると、この結果が生成されます。

ProxyAuthenticationRequired (407) is not one of the following: 
OK (200), Created (201), Accepted (202), NonAuthoritativeInformation
(203), NoContent (204), ResetContent (205), PartialContent (206).

私がやりたいのは、このコードで、特定の Web サイトが稼働しているかどうかを検証することだけです。何か案は?

4

3 に答える 3

1

EnsureStatusIsSuccessful()ステータスコード(Webサーバーから返された)がそのコードの1つではない場合、例外がスローされます。

例外をスローせずに単純にチェックするIsSuccessStatusCodeためにできることは、プロパティを使用することです。このような:

HttpResponseMessage response = client.Get(url);
bool isValidAndAccessible = response.IsSuccessStatusCode;

が成功範囲StatusCode内にあるかどうかをチェックするだけであることに注意してください。

あなたの場合、ステータス コード (407) は、認証を必要とするプロキシを介してその Web サイトにアクセスしていて、リクエストが失敗したことを意味します。次のことができます。

  • クラスでプロキシの設定を提供します(デフォルトが機能しない場合)WebProxy
  • ページをダウンロードせずに、Web サーバーに ping を試みます。それが Web ページかどうかはわかりませんが、アクセス可能で有効な URL であることは確認できます。該当するかどうかはコンテキストによって異なりますが、HTTP 要求が失敗した場合に役立つ場合があります。

WebProxywith WebRequest(base class for )を使用した MSDN の例HttpWebRequest:

var request = WebRequest.Create("http://www.contoso.com");
request.Proxy = new WebProxy("http://proxyserver:80/",true);

var response = (HttpWebResponse)request.GetResponse();
int statusCode = (int)response.StatusCode;
bool isValidAndAccessible = statusCode >= 200 && statusCode <= 299;
于 2013-10-15T11:48:19.853 に答える
1

これは基本的に、使用が認証されていないプロキシを介してサービスにアクセスしようとしていることを意味します。

これは、Web サービスからサーバーに到達したものの、認証されていないプロキシ経由でアクセスしようとしたため、到達しようとした URL へのアクセスが許可されなかったことを意味していると思います。

于 2013-10-15T11:49:38.023 に答える
0

あなたとホストの間に認証を必要とするプロキシサーバーがあるため、リクエストが成功しなかったと正当に不平を言う、EnsureStatusIsSuccessful() を呼び出しています。

フレームワーク 4.5 を使用している場合は、以下に少し強化されたバージョンを含めました。

internal static async Task<bool> ValidateUrl(string url)
{
  Uri validUri;
  if(Uri.TryCreate(url,UriKind.Absolute,out validUri))
  {
    var client = new HttpClient();

    var response = await client.GetAsync(validUri, HttpCompletionOption.ResponseHeadersRead);
    return response.IsSuccessStatusCode;
  }

  return false;
 }
于 2013-10-15T11:48:44.430 に答える