6

我有以下代码,我用它下载一个网页到一个字节数组中,然后用 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]);
  }
  /***************************************************/

但是它不起作用,我得到以下异常:

必须使用适当的属性修改此标头。参数名称:名称

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

谢谢你。

4

2 回答 2

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

我怀疑这样做的原因是许多标头(例如 Date 和 host)必须在不同的请求上进行不同的设置。你不应该复制它们。事实上,我个人可能会建议您不要复制其中任何一个。放入您自己的用户代理 - 如果您获得的页面依赖于某个值,那么我认为您希望确保始终发送有效值,而不是依赖原始用户向您提供该信息。

Essentially work out what you need to do rather than finding something that works and doing that without fully understanding what you are doing.

于 2011-09-29T12:10:45.670 回答
1

看起来您正在尝试设置一些必须使用 WebClient 属性(或)之一设置CachePolicyContentLengthContentType

此外,盲目复制所有标题也不是很好,您需要只获取您真正需要的那些。

于 2011-09-29T11:35:36.920 回答