HttpClient / WebClient - 通过代理与网站交互的麻烦

时间:2014-07-21 17:22:53

标签: c# .net

我想使用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,我从来没有在我提出的任何请求中看到代理授权 - 但它仍适用于前三个网站。

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

3 个答案:

答案 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以编程方式设置代理凭据真的很烦人。您希望您能够在配置中完成所有操作,但它并不是开箱即用的。您只能在配置中设置代理地址,而不能在凭证中设置。