使用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]); } /***************************************************/ 

但它不起作用,我得到以下exception:

必须使用适当的property.Parameter name:name修改此标头

有人可以帮我这个吗? 使用WebClient添加请求标头的正确方法是什么?

谢谢。

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

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

某些公共标头被视为受限制并受系统保护,无法在WebHeaderCollection对象中设置或更改。 在尝试发送WebClient请求时,任何尝试在与WebClient对象关联的WebHeaderCollection对象中设置其中一个受限标头的尝试都将引发exception。

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

 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 )设置的标头

而且,盲目复制所有标题并不是很好,你需要得到你真正需要的那些。