【发布时间】: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 中,我永远无法在我提出的任何请求中看到代理授权 - 但它仍然适用于前三个站点。
我确定我错过了什么,但我不知所措。任何帮助将不胜感激。
【问题讨论】: