[英]Change restricted HttpWebRequest headers in Unity
我想通过将自定义值添加到“主机”的请求标头来通过其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版本统一更改为更高版本?
您可以通过反射来做到这一点。 不幸的是,由于Unity使用的是Mono,并且它们的变量名称完全不同,因此GetField
无法找到保存标头的变量,因此类似问题的C#答案均GetField
。
使用HttpWebRequest.GetType().GetFields
转储HttpWebRequest
类中的所有标头,然后查找包含标头的字段的名称。 在我的测试中,字段名称为"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);
}
}
用法 :
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版本以及如何找到字段名称,以便将来将来更改变量名称时,任何人都可以对其进行修复。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.