在Unity中更改受限制的HttpWebRequest标头

时间:2017-10-10 08:09:31

标签: c# unity3d http-headers httpwebrequest host

我想通过添加自定义值来为“主机”请求标头,通过其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版本更改为更高版本?

1 个答案:

答案 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版本以及我如何找到字段名称,以便将来变量名称更改时,任何人都可以简单地修复它。