HTTP标头

There are 1 entries for the tag HTTP标头

异常处理:必须使用适当的属性或方法修改此标头

MitchellChu 2013-09-03 .NET技术

在 .NET (v4.0)中,使用HttpWebRequest请求Web页面,当向HttpWebRequest的Headers的标头集合中添加Referer,Host这类HTTP标头(Header)时,会收到:System.ArgumentException: 必须使用适当的属性或方法修改此标头。这样的报错! 这个问题的引起在官方的说法是: 通常通过 WebRequest.Headers 或 WebResponse.Headers 访问 WebHeaderCollection 类。 某些公共标头被视为受限制的,它们或者直接由 API(如 Content-Type)公开,或者受到系统保护,不能被更改。 受限制的标头是: Accept Connection Content-Length Content-Type Date Expect Host If-Modified-Since Range Referer Transfer-Encoding User-Agent Proxy-Connection 要解决这个问题可以用以下这些方法: 方法一: 通过HttpWebRequest/HttpWebResponse对象的相应属性来设置这些表头 HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://blog.useasp.net/"); request.Host = "http://blog.useasp.net/"; request.Referer = "http://blog.useasp.net/tags/.net"; /* 你可以在这里设置其他限制的标头. 注意: Range HTTP标头是通过AddRange来添加 If-Modified-Since HTTP标头通过IfModifiedSince 属性设置 Accept由 Accept 属性设置。 Connection由 Connection 属性和 KeepAlive 属性设置。 Content-Length由 ContentLength 属性设置。 Content-Type由 ContentType 属性设置。 Expect由 Expect 属性设置。 Date由 Date属性设置,默认为系统的当前时间。 Host由系统设置为当前主机信息。 Referer由 Referer 属性设置。 Transfer-Encoding由 TransferEncoding 属性设置(SendChunked 属性必须为 true)。 User-Agent由 UserAgent 属性设置。 */ using((HttpWebResponse)response = (HttpWebResponse)request.GetResponse()) { // do something here too. by Mitchell Chu } 要将所有的这些受限HTTP标头在写程序的时候记住,还是有点难度的,我们更希望能够自动判定那些HTTP标头是可以直接添加的,哪些是需要特殊处理的。在WebHeaderCollection中有个方法IsRestricted正好是解决这个问题的。因此上面的代码可以改为将所有需要的标头添加到WebHeaderCollection,在为HttpWebRequest添加标头的时候,再使用IsRestricted来确定特殊处理与否。 foreach (string key in headers.AllKeys) { if (!WebHeaderCollection.IsRestricted(key)) request.Headers.Add(key, headers[key]); else { // do some thing, use HttpWebRequest propertiers to add restricted http header. ...

关于博主

  一枚成分复杂的网络IT分子,常年游弋于电子商务,属于互联网行业分类中的杂牌军。当前正在待业中...