【问题标题】:HttpClient failing in accessing simple websiteHttpClient 无法访问简单的网站
【发布时间】:2013-10-26 03:29:35
【问题描述】:

这是我的代码

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

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

      使用 WebProxyWebRequest 的 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;
      

      【讨论】:

      • 感谢@Adriano 的回答,如果不是关于使用异步和等待,我会采用这种方法。
      【解决方案3】:

      您正在调用 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;
       }
      

      【讨论】:

      • 嗯,我不会调用一个抛出异常的方法只是为了吞下那个异常......如果有要检查的属性不会抛出
      • 没错,但我不想与 OPs 版本有太多偏差。反正改了。
      • 所有答案都是有效的,因为它使用了最新的 4.5 async await 关键字。我会坚持这个。谢谢@Oliver
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-14
      • 1970-01-01
      • 1970-01-01
      • 2019-08-10
      • 2017-06-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多