网页前端设计

http://www.86y.org

搜索文章

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

用声音读出全文关注我吧
 2017/7/29 11:34:14 阅读次数:31297

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头。可以抓取页面了!


大家有什么问题或技术上的想法可以在此与大家分享,也可以加入前端爱好者QQ群(141999928)一起学习进步:【幸凡前端技术交流群】
0

如果您觉得本文的内容对您的学习有所帮助,捐赠与共勉,支付宝(左)或微信(右)

阅读全文内容关闭