我想使用HttpClient
与网站互动。这是在企业类型的环境中,所有Web访问都通过Web代理进行。默认情况下,HttpClient和WebClient似乎只是工作'在这里使用代理 - 但我也在代码中指定了代理详细信息。
我的问题是某些网址会正确加载,其他网址则不会。以下代码显示了我的意思。
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 - 我可以浏览所有四个示例网址。代理不会阻止我,或显示相同的错误消息。
似乎代码仅在具有非&www; www的网站上失败。子域名 - 当它是非.com站点时。听起来很疯狂。
我尝试在本地运行Fiddler以查看请求之间是否存在任何不同之处 - 从我看到的内容 - 看起来相同,除了URL:
获取http://maps.google.ie/ HTTP / 1.1主机:maps.google.ie 代理连接:保持活跃
获取http://www.google.com/ HTTP / 1.1主机:www.google.com 代理连接:保持活跃
在' Auth' tab fiddler显示:
没有代理授权标头。
没有授权标题。
两者兼而有之。但.com示例有效;并且.ie示例失败。我尝试从Chrome中提取相同的maps.google.ie网址 - 效果很好,我可以看到它有代理授权吗?GET
获取http://maps.google.ie/ HTTP / 1.1主机:maps.google.ie 代理连接:保持活动代理授权:NTLM T3RMTVNTUAAFAAACB4IBogQABAAzAAAACwALACgAAAAGAbFdAAAAD1BBVUxTT01xOTlEU1UTUR ==
谁能告诉我这里发生了什么?如果我需要代理授权,我如何让HttpClient / WebClient包含它? 我尝试创建WebProxy并在其上设置凭据 - 使用CredentialCache并提供用户名/通行证/域名(以及我能想到的域名的每个变体)。当我弄错了' - 所有网站似乎都返回403.但是当我做对了 - 前3名工作和第4次没有。在Fiddler,我从来没有在我提出的任何请求中看到代理授权 - 但它仍适用于前三个网站。
我确定我错过了什么,但我不知所措。任何帮助将不胜感激。
答案 0 :(得分: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
我不明白为什么&#34; UseDefaultCredentials&#34;不默认为true。如果您在使用代理的公司工作,任何不这样做的应用都无法离开局域网。
答案 1 :(得分:1)
Moby Disk和Aron都是正确的,因为这些是指定代理的方式。但正如我的问题所述,使用它们并没有帮助。
无论出于何种原因,Web代理都需要设置User-Agent。一旦设定,一切正常。
_client.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0");
答案 2 :(得分:0)
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以编程方式设置代理凭据真的很烦人。您希望您能够在配置中完成所有操作,但它并不是开箱即用的。您只能在配置中设置代理地址,而不能在凭证中设置。