2011-09-29 106 views
6

我有,我下載一個網頁到一個字節數組,然後將下面的代碼用的Response.Write打印:添加請求頭與Web客戶端C#

WebClient client = new WebClient(); 

byte[] data = client.DownloadData(requestUri); 

    /***********  Init response headers ********/ 
    WebHeaderCollection responseHeaders = client.ResponseHeaders; 
    for (int i = 0; i < responseHeaders.Count; i++) 
     { 
      Response.Headers.Add(responseHeaders.GetKey(i), responseHeaders[i]); 
     } 
    /***************************************************/ 

除了響應頭,我需要以添加請求標題。我嘗試用下面的代碼來做到這一點:

/***********  Init request headers ********/ 
    NameValueCollection requestHeaders = Request.Headers; 
    foreach (string key in requestHeaders) 
    { 
     client.Headers.Add(key, requestHeaders[key]); 
    } 
    /***************************************************/ 

但是它不工作,我得到以下異常:

這頭必須使用適當的property.Parameter名稱進行修改:姓名

有人可以幫我嗎?使用WebClient添加請求標頭的正確方法是什麼?

謝謝。

+0

你想要做的事對我來說看起來很奇怪。您是否需要將頁面請求中的某些標題傳遞給WebClient? –

+0

我試圖做的是 - 使用WebClient下載頁面。爲了正確地做到這一點,我需要傳遞正確的請求標題,例如User-Agent等。這些應該與瀏覽器窗口中加載頁面時由瀏覽器發送的標題相同。 – cycero

+0

什麼類型的異常? –

回答

5

的頭集「保護」一些爲MSDN的頁面在這裏描述的可能的頭:http://msdn.microsoft.com/en-us/library/system.net.webclient.headers.aspx

該網頁似乎給所有您需要的答案,但引用的重要組成部分:

某些常見標頭被認爲是受限制的,受 系統保護,無法在WebHeaderCollection對象中進行設置或更改。 任何嘗試在與WebClient對象關聯的 WebHeaderCollection對象中設置其中一個限制標頭時, 將在嘗試發送WebClient 請求時稍後發出異常。

由系統保護的受限制的接頭連接器包括,但不 限於以下:

Date 

Host 

另外,使用一個 WebClient的對象時一些其它標頭也受到限制。這些受限制的接頭連接器包括,但不 限於以下:

Accept 

Connection 

Content-Length 

Expect (when the value is set to "100-continue" 

If-Modified-Since 

Range 

Transfer-Encoding 

HttpWebRequest類具有用於設置上述一些 頭的性能。如果應用程序設置這些標頭很重要,則應使用HttpWebRequest類而不是WebRequest 類。

我懷疑這樣做的原因是許多標題,如日期和主機必須設置不同的不同的請求。你不應該複製它們。事實上,我個人可能會建議你不要複製它們中的任何一個。放入您自己的用戶代理 - 如果您所獲得的頁面依賴於某個特定的值,那麼我認爲您要確保始終發送有效的值,而不是依賴原始用戶向您提供該信息。

從根本上解決你需要做的事情,而不是找到有效的工作,而不是完全理解你在做什麼。

+1

Excactly my problem。我必須設置Accept頭,我這樣做:((HttpWebRequest)請求).Accept =「application/json」;我正在使用WebRequest.Create。 –

+0

((HttpWebRequest)webRequest)解決了同樣的問題.UserAgent = Request.UserAgent;這是一個代理 – Morvael

1

貌似你試圖設置一些頭這是必須使用Web客戶端的屬性(CachePolicyContentLengthContentType

另外的一個設置,它不是非常好,所有的頭盲目照搬,你需要得到你真正需要的。