c# - 使用 System.Net.WebRequest 时无法设置某些 HTTP header

标签 c# header webrequest

当我尝试在 WebRequest 对象上添加 HTTP header 键/值对时,出现以下异常:

This header must be modified using the appropriate property

我已经尝试使用 Add() 方法向 Headers 集合添加新值,但我仍然遇到相同的异常。

webRequest.Headers.Add(HttpRequestHeader.Referer, "http://stackoverflow.com");

我可以通过将 WebRequest 对象转换为 HttpWebRequest 并设置诸如 httpWebReq.Referer ="http://stackoverflow.com" 之类的属性来解决这个问题,但这只适用于少数人通过属性公开的 header 。

我想知道是否有一种方法可以更精细地控制通过请求远程资源修改 header 。

最佳答案

如果您需要简短的技术答案,请直接转到答案的最后一部分。

如果您想了解得更多,请阅读所有内容,希望您会喜欢...


我今天也反驳了这个问题,今天发现的是:

  1. 以上答案都是正确的,因为:

    1.1 它告诉您您要添加的 header 已经存在,然后您应该使用适当的属性(例如索引器)修改它的值,而不是再次尝试添加它。

    1.2 任何时候您要更改 HttpWebRequest 的 header ,您都需要在对象本身上使用适当的属性(如果存在)。

感谢 FOR 和 Jvenema 的领先指南...

  1. 但是,我发现,那是拼图中缺失的部分是:

    2.1 WebHeaderCollection类一般通过WebRequest.Headers或者WebResponse.Headers来访问。 一些常见的 header 被认为是受限制的,要么直接由 API 公开(例如 Content-Type),要么受系统保护且无法更改。

受限制的 header 是:

  • 接受
  • 连接
  • 内容长度
  • 内容类型
  • 日期
  • 期待
  • 主持人
  • If-Modified-Since
  • 范围
  • 推荐人
  • 传输编码
  • 用户代理
  • 代理连接

所以,下次当你遇到这个异常并且不知道如何解决这个问题时,请记住有一些受限的 header ,解决方案是使用 WebRequest< 中的适当属性显式修改它们的值/HttpWebRequest 类。


编辑:(有用,来自评论,用户评论Kaido)

Solution is to check if the header exists already or is restricted (WebHeaderCollection.IsRestricted(key)) before calling add

关于c# - 使用 System.Net.WebRequest 时无法设置某些 HTTP header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/239725/

相关文章:

c# - WebRequest 奇怪的 NotFound 错误

c# - 使用 MonoTouch 的异步请求

C# 为什么我可以在常量上调用对象扩展方法?

c# - 为什么为指针和 ref 生成的 IL 代码相同但签名不同?

PHP header 位置

c++ - 当 C++ 标准提供将名称带入全局命名空间的 C header 时,这是否包括重载?

c# - 如何防止事件导致其自身的事件在 C# 中触发?

c# - 通用方法 - 无法将类型 'string' 隐式转换为 T

iphone - 是否可以在旧版本的 gcc (g++) 上使用更新的 header ?

c# - 发送多个并行 Web 请求