我想通过添加自定义值来为“主机”请求标头,通过其IP地址调用网页。
“
”代码:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://1.1.1.1");
request.Headers["Host"] = "xyz.net";
WebResponse response = request.GetResponse();
但是它给出了一个错误:
ArgumentException:受限制的标题
似乎无法在.net 2.0中修改某些标头 那么有什么方法可以更改主机或将.net版本更改为更高版本?
答案 0 :(得分:2)
你可以用反射做到这一点。遗憾的是,类似问题的C#答案都不起作用,因为Unity使用Mono并且它们的变量名称完全不同,因此GetField
无法找到持有标题的变量。
使用HttpWebRequest
转储HttpWebRequest.GetType().GetFields
类中的所有标头,然后查找包含标头的字段的名称。在我的测试中,字段名称为 "webHeaders"
,类型为WebHeaderCollection
。
以下是一种从反射中修改 "webHeaders"
的扩展方法:
public static class ExtensionMethods
{
public static void changeSysTemHeader(this HttpWebRequest request, string key, string value)
{
WebHeaderCollection wHeader = new WebHeaderCollection();
wHeader[key] = value;
FieldInfo fildInfo = request.GetType().GetField("webHeaders",
System.Reflection.BindingFlags.NonPublic
| System.Reflection.BindingFlags.Instance
| System.Reflection.BindingFlags.GetField);
fildInfo.SetValue(request, wHeader);
}
public static void changeReflectionField(this HttpWebRequest request, string fieldName, object value)
{
FieldInfo fildInfo = request.GetType().GetField(fieldName, System.Reflection.BindingFlags.NonPublic
| System.Reflection.BindingFlags.Instance
| System.Reflection.BindingFlags.GetField);
fildInfo.SetValue(request, value);
}
}
<强> USAGE 强>:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://1.1.1.1");
//Change Host header
request.changeSysTemHeader("Host", "xyz.net");
request.changeReflectionField("hostChanged", true);
WebResponse response = request.GetResponse();
这适用于任何受限制的标题,例如 User-Agent
。使用 Unity 2017.2 进行测试。提到Unity版本以及我如何找到字段名称,以便将来变量名称更改时,任何人都可以简单地修复它。