使用WebClient C#添加请求标头

时间:2011-09-29 11:05:53

标签: c# webclient request-headers

我有以下代码,我将网页下载到字节数组中,然后使用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添加请求标头的正确方法是什么?

谢谢。

2 个答案:

答案 0 :(得分:5)

标题集合“保护”了一些可能的标题,如msdn页面上所述:http://msdn.microsoft.com/en-us/library/system.net.webclient.headers.aspx

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

  

某些常见标头被视为受限制并受到保护   系统,无法在WebHeaderCollection对象中设置或更改。   任何尝试在其中设置其中一个受限制的标头的尝试   与WebClient对象关联的WebHeaderCollection对象将   稍后在尝试发送WebClient时抛出异常   请求。

     

受系统保护的受限制标头包括但不包括   仅限于以下内容:

Date

Host
     

此外,使用a时,其他一些标题也受到限制   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)必须在不同的请求上设置不同。你不应该复制它们。事实上,我个人可能会建议你不要复制其中任何一个。放入您自己的用户代理 - 如果您获得的页面依赖于某个值,那么我认为您希望确保始终发送有效值而不是依赖原始用户来提供该信息。

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

答案 1 :(得分:1)

看起来您正在尝试设置一些必须使用其中一个WebClient属性设置的标头(CachePolicyContentLengthContentType

此外,盲目复制所有标题并不是很好,你需要得到你真正需要的标题。