C#.NET用HttpWebRequest来post数据时想修改http头,却提示无法直接修改标题“Host”、Keep-Alive和Close不能使用此属性设置的解决办法

分类:.NET
 标签:http头,HttpWebRequest,.net,C#
   修改 | 阅读(13128)| 评论(0)

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

request.Headers.Set("Host", "hejingzong.cn");

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

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

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

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

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

request.Connection = "keep-alive";

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

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

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

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", "hejingzong.cn");
SetHeaderValue(request.Headers, "Connection", "keep-alive");

调用上面的方法来设置,然后抓包查看,确实是改成了我们想要的http头。


您的昵称:*
QQ登录(无需注册直接登录可进行回复)
您的邮箱:(填写邮箱,如有回复可进行邮件通知)
验证码:
点击刷新