HttpClient无法访问简单的网站

时间:2013-10-15 11:41:51

标签: c# .net http web dotnet-httpclient

这是我的代码

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

我想做的就是让这段代码验证某个网站是否已启动并运行。 有什么想法吗?

3 个答案:

答案 0 :(得分:1)

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

您可以执行的操作,只需检查而不会抛出异常就是使用IsSuccessStatusCode属性。像这样:

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

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

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

  • 使用WebProxy类提供Proxy的设置(如果默认设置不起作用)。
  • 请勿下载页面,只是尝试ping网络服务器。你不会知道它是否是一个网页,但你会确定它是可访问的,它是一个有效的URL。如果适用或不适用取决于上下文,但如果HTTP请求失败则可能有用。

MSDN使用WebProxyWebRequestHttpWebRequest的基类)的MSDN示例:

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;

答案 1 :(得分:1)

这基本上意味着它所说的内容:您尝试通过未经过身份验证的代理来访问服务。

我想这意味着您的服务器是从Web服务到达的,但是它不允许访问它尝试访问的URL,因为它试图通过未经过身份验证的代理访问它。

答案 2 :(得分: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;
 }