使用 WebClient C# 添加请求标头

Posted

技术标签:

【中文标题】使用 WebClient C# 添加请求标头【英文标题】:Add request headers with WebClient C# 【发布时间】:2011-11-27 15:02:15 【问题描述】:

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

谢谢。

【问题讨论】:

您尝试做的事情对我来说看起来很奇怪。您是否需要将页面请求中的一些标头传递给 WebClient? 我尝试做的是 - 使用 WebClient 下载页面。要正确执行此操作,我需要传递正确的请求标头,例如 User-Agent 等。这些标头应该与我在浏览器窗口中加载页面时浏览器发送的相同标头。 异常文本:此标头必须使用适当的属性进行修改。参数名称:名称 【参考方案1】:

标头集合“保护”了一些可能的标头,如此处的 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)必须针对不同的请求进行不同的设置。你不应该复制它们。事实上,我个人可能会建议您不要复制其中任何一个。放入您自己的用户代理 - 如果您获得的页面依赖于某个值,那么我认为您希望确保始终发送有效值,而不是依赖原始用户向您提供该信息。

本质上是弄清楚你需要做什么,而不是在没有完全理解你在做什么的情况下找到有效的东西然后去做。

【讨论】:

正是我的问题。我必须设置 Accept 标头,而是这样做: ((HttpWebRequest) request).Accept = "application/json";我正在使用 WebRequest.Create。 使用 ((HttpWebRequest)webRequest).UserAgent = Request.UserAgent; 解决了同样的问题这是一个代理【参考方案2】:

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

而且,一味地复制所有的标题也不是很好,你需要的只是你真正需要的。

【讨论】:

以上是关于使用 WebClient C# 添加请求标头的主要内容,如果未能解决你的问题,请参考以下文章

如何向 WebClient (C#) 添加证书?

为WebClient请求设置User-Agent标头

使用 WebClient 将带有标头的请求发送到第三方 api

WebClient 未向 Windows Phone 中的 Web 服务发送授权标头

缺少使用 WebClient 发送 POST 请求的 Content-Length 标头(SpringBoot 2.0.2.RELEASE)

如何使用带有 WebClient 的 spring-security-oauth2 自定义 OAuth2 令牌请求的授权标头?