文章详细
C#.NET用HttpWebRequest 添加 headr 解决方法
 2017/7/29 11:34:14 评论:0人 阅读次数:32232

C#.NET用HttpWebRequest 添加 headr 解决方法

平时写HttpWebRequest程序抓取html时,我们经常要模拟浏览器进行数据的获取或提交,因此就必须要对http头的相关属性进行设置。但当我需要设置“Host”值的时候,比如:

request.Headers.Set("Host", "86y.org");

以为万事大吉了,但运行时却提示【无法直接修改标题“Host”】,无法修改!怎么办?

在http头中,不仅“Host”不能设置,其他的一些属性也有无法设置的情况,比如“Connection”

request.Headers.Set("Connection", "keep-alive");

这样写会提示【此标头必须使用适当的属性进行修改。】

哦,request有Connection属性,于是改成:

request.Connection = "keep-alive";

别以为这下可以了,运行时报错【Keep-Alive 和 Close 不能使用此属性设置】

不能进行设置?那我们的模拟浏览器post数据怎么办?

后来在网上找到了相关的解决办法,在哪里找到的忘了。记得是查看了.NET的源码,写出了如下代码来实现的:

//需要引用 using System.Collections.Specialized;
public static void SetHeaderValue(WebHeaderCollection header, string name, string value)
{
    var property = typeof(WebHeaderCollection).GetProperty("InnerCollection",
        System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
    if (property != null)
    {
        var collection = property.GetValue(header, null) as NameValueCollection;
        collection[name] = value;
    }
}

这样要设置相应的http头就简单很多了,上面所说的两个http头可以直接如下代码一样进行设置:

SetHeaderValue(request.Headers, "Host", "86y.org");
SetHeaderValue(request.Headers, "Connection", "keep-alive");

这样是不是方便很多呢,调用上面的方法来设置,然后抓包查看,确实是改成了我们想要的http头。可以抓取页面了!

如需转载请注明出处:http://www.86y.org/art_detail.aspx?id=833【C#.NET用HttpWebRequest 添加 headr 解决方法】幸凡学习网
0
 
相关文章
推荐文章
Created By Charry-May 3,2010
粤ICP备10093478号-1
顶部