小编典典

使用System.Net.WebRequest时无法设置一些HTTP标头

c#

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

必须使用适当的属性修改此标头

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

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

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

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


阅读 335

收藏
2020-05-19

共1个答案

小编典典

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

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


我今天也解决了这个问题,今天我发现的是:

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

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

1.2随时更改的标头HttpWebRequest,都需要在对象本身上使用适当的属性(如果存在)。

感谢FOR和Jvenema提供的领先指南…

  1. 但是,我发现的 是,这个难题中缺少的部分 是:

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

受限制的标头是:

  • Accept
  • Connection
  • Content-Length
  • Content-Type
  • Date
  • Expect
  • Host
  • If-Modified-Since
  • Range
  • Referer
  • Transfer-Encoding
  • User-Agent
  • Proxy-Connection

因此,下次您遇到此异常并且不知道如何解决此异常时,请记住,存在一些受限制的标头,而解决方案是使用WebRequest/
HttpWebRequest类中的相应属性显式修改其值。


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

解决方案是WebHeaderCollection.IsRestricted(key)在调用add之前检查标头是否已存在或是否受到限制()

2020-05-19