【问题标题】:HttpClient / WebClient - Trouble Interacting With Websites via ProxyHttpClient / WebClient - 无法通过代理与网站交互
【发布时间】:2014-09-12 07:22:59
【问题描述】:

我想使用HttpClient 与网站互动。这是在企业类型的环境中,所有 Web 访问都通过 Web 代理。默认情况下,HttpClient 和 WebClient 似乎都与这里的代理“正常工作” - 但我还在代码中指定了代理详细信息。

我的问题是某些 URL 会正确加载,而另一些则不会。下面的代码说明了我的意思。

var webc = new WebClient();

var x1 = webc.DownloadString("http://www.google.com");  // Works
var x2 = webc.DownloadString("http://www.google.ie");   // Works
var x3 = webc.DownloadString("http://maps.google.com"); // Works
var x4 = webc.DownloadString("http://maps.google.ie");  // 403 Forbidden exception

我看到 HttpClient 的行为相同,但代码更冗长。如果我获取在 403 错误中返回的 HTML,则表明我尚未通过身份验证并将我的用户名显示为空。

使用 Chrome/FF/IE - 我可以浏览到所有四个示例 URL。代理不会阻止我,也不会显示相同的错误消息。

似乎代码仅在具有非“www”子域的站点上失败 - 当它是非 .com 站点时。听起来很疯狂。

我尝试在本地运行 Fiddler 以查看请求之间是否有任何不同 - 据我所见 - 它看起来相同,除了 URL:

GET http://maps.google.ie/ HTTP/1.1 主机:maps.google.ie 代理连接:保持活动状态

GET http://www.google.com/ HTTP/1.1 主机:www.google.com 代理连接:保持活动状态

在 'Auth' 选项卡中提琴手显示:

不存在代理授权标头。

不存在授权标头。

两者兼而有之。但是 .com 示例有效;并且 .ie 示例失败。我尝试从 Chrome 中提取相同的 maps.google.ie URL - 效果很好,我可以看到它的 GET 中有一个代理授权

GET http://maps.google.ie/ HTTP/1.1 主机:maps.google.ie 代理连接:保持活动代理授权:NTLM T3RMTVNTUAAFAAACB4IBogQABAAzAAAACwALACgAAAAGAbFdAAAAD1BBVUxTT01xOTlEU1UTUR==

谁能告诉我这里发生了什么?如果代理授权是我需要的,我如何让 HttpClient/WebClient 包含它? 我尝试创建一个 WebProxy 并在其上设置凭据 - 使用 CredentialCache 并提供用户名/密码/域(以及我能想到的每个域名变体)。当我得到它“错误”时 - 所有网站似乎都返回 403。但是当我做对时 - 前 3 名有效,而第 4 名无效。在 Fiddler 中,我永远无法在我提出的任何请求中看到代理授权 - 但它仍然适用于前三个站点。

我确定我错过了什么,但我不知所措。任何帮助将不胜感激。

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    有两种方式:

    var webc = new WebClient();
    webc.UseDefaultCredentials = true;
    var x4 = webc.DownloadString("http://maps.google.ie");
    

    或者,把它放在你的 app.config 中

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <system.net>
        <defaultProxy useDefaultCredentials="true" />
      </system.net>
    </configuration>
    

    在此处查看 tomfanning 的答案:Proxy Basic Authentication in C#: HTTP 407 error

    我不明白为什么“UseDefaultCredentials”不默认为 true。如果您在使用代理的公司工作,任何不这样做的应用程序都无法离开 LAN。

    【讨论】:

      【解决方案2】:

      Moby Disk 和 Aron 都是正确的,因为它们是指定代理的方式。但正如我的问题中提到的,使用它们并没有帮助。

      无论出于何种原因,Web 代理都需要设置用户代理。设置好后,一切正常。

      _client.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0");
      

      【讨论】:

      • 您的 IT 部门需要修复他们的代理服务器!
      【解决方案3】:
      var webc = new WebClient
      {
          Proxy = new WebProxy
          {
              Credentials = new NetworkCredential(...),
          }
      };
      
      
      var x1 = webc.DownloadString("http://www.google.com");  // Works
      var x2 = webc.DownloadString("http://www.google.ie");   // Works
      var x3 = webc.DownloadString("http://maps.google.com"); // Works
      var x4 = webc.DownloadString("http://maps.google.ie");  // 403 Forbidden exception
      

      不幸的是,.net 以编程方式设置代理凭据真的很烦人。您希望您应该能够在配置中完成所有这些操作,但它并不是开箱即用的。您只能在配置中设置代理地址,而不能在凭据中设置。

      【讨论】:

        猜你喜欢
        • 2018-07-26
        • 1970-01-01
        • 2018-07-10
        • 1970-01-01
        • 2011-10-06
        • 1970-01-01
        • 2015-12-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多