繁体   English   中英

在Unity中更改受限的HttpWebRequest标头

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM