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

在 .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.
    }
}

方法二: 继承WebHeaderCollection,通过AddWithoutValidate方法来添加表头

public class InheritWebHeaders : WebHeaderCollection
{
    /*
    define your properties & methods here. -- by Mitchell Chu
    */
    public void AddHeaderWithoutValidate(
        string name
        , string value)
    {
        base.AddWithoutValidate(name, value);
    }
}
// usage:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://blog.useasp.net/");
InheritWebHeaders headers = new InheritWebHeaders();
headers.AddHeaderWithoutValidate("Referrer", "http://blog.useasp.net/tag/.net");
// other HTTP Headers
request.Headers = headers;
/// do more here...


本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年4月    »
1234567
891011121314
15161718192021
22232425262728
2930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864