2014-07-21 76 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 「不默認爲真。如果您在使用代理的公司工作,則任何不這樣做的應用程序都無法離開局域網。

相關問題