簡體   English   中英

使用WebClient C#添加請求標頭

[英]Add request headers with WebClient C#

我有以下代碼,我將一個網頁下載到一個字節數組,然后用Response.Write打印它:

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 name:name修改此標頭

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

謝謝。

標題集合“保護”一些可能的標題,如msdn頁面上所述: http//msdn.microsoft.com/en-us/library/system.net.webclient.headers.aspx

該頁面似乎提供了您需要的所有答案,但引用了重要部分:

某些公共標頭被視為受限制並受系統保護,無法在WebHeaderCollection對象中進行設置或更改。 在嘗試發送WebClient請求時,任何嘗試在與WebClient對象關聯的WebHeaderCollection對象中設置其中一個受限標頭的嘗試都將引發異常。

受系統保護的受限標頭包括但不限於以下內容:

 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類。

我懷疑其原因是許多標題(例如Date和host)必須在不同的請求上設置不同。 你不應該復制它們。 事實上,我個人可能會建議你不要復制其中任何一個。 放入您自己的用戶代理 - 如果您獲得的頁面依賴於某個值,那么我認為您要確保始終發送有效值而不是依賴原始用戶來提供該信息。

基本上可以找出你需要做的事情,而不是在沒有完全理解你在做什么的情況下找到有效的方法。

看起來你正在嘗試設置一些必須使用其中一個WebClient屬性( CachePolicyContentLengthContentType )設置的標頭

此外,盲目復制所有標題並不是很好,你需要得到你真正需要的那些。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM