2014-07-21 80 views
0

我想使用HttpClient与网站进行交互。这是在公司类型的环境中,所有的Web访问都通过一个Web代理。默认情况下,HttpClient和WebClient似乎都只是在这里使用代理 - 但我也在代码中指定了代理细节。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网站时。听起来很疯狂。

我试图在本地运行菲德勒,看看什么是请求之间的不同 - 从我所看到的 - 它看起来相同,除了网址:

GET http://maps.google.ie/ HTTP/1.1主机:地图.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。即 代理连接:保持活跃代理授权:NTLM T3RMTVNTUAAFAAACB4IBogQABAAzAAAACwALACgAAAAGAbFdAAAAD1BBVUxTT01xOTlEU1UTUR ==

谁能告诉我这是怎么回事?如果该代理授权是我所需要的,那么我如何让HttpClient/WebClient包含它? 我试过创建一个WebProxy并在其上设置凭证 - 与CredentialCache一起提供用户名/密码/域名(以及我想到的域名的每个变体)。当我得到它'错误' - 所有网站似乎返回403.但是,当我得到它的权利 - 前3名工作和第四名不。在Fiddler中,我永远无法在我所做的任何请求中看到代理授权 - 但它仍然适用于前三个网站。

我确定我错过了一些东西,但我不知所措。任何帮助将非常感激。

回答

1

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"); 
+1

您的IT部门需要修复其代理服务器! –

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是真的很烦人的编程设置代理证书。你期望你应该能够在配置中完成所有这些工作,但它并不适用于开箱即用。您只能在配置中设置代理地址,而不是凭据。

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 “不默认为真。如果您在使用代理的公司工作,则任何不这样做的应用程序都无法离开局域网。

相关问题