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).

我想做的就是让这段代码验证给定的网站是否启动并运行。有任何想法吗?

4

3 回答 3

1

就是EnsureStatusIsSuccessful()这样,如果状态代码(从 Web 服务器返回)不是其中之一,它会引发异常。

您可以做的是简单地检查而不抛出异常是使用IsSuccessStatusCode属性。像这样:

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

请注意,它只是检查是否StatusCode成功范围内。

在您的情况下,状态代码 (407) 表示您正在通过需要身份验证的代理访问该网站,然后请求失败。您可以执行以下操作:

  • 为类提供代理设置(以防默认设置不起作用)WebProxy
  • 不要下载页面,而只是尝试 ping Web 服务器。你不会知道它是否是一个网页,但你会确定它是可访问的并且它是一个有效的 URL。如果适用或不适用取决于上下文,但如果 HTTP 请求失败,它可能很有用。

MSDN 中使用WebProxywith WebRequest(基类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 回答