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