2017-10-10 9 views
1

"host"の要求ヘッダーにカスタム値を追加することで、IPアドレスでWebページを呼び出す必要があります。 「
」コード:Unityの制限付きHttpWebRequestヘッダーを変更する

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://1.1.1.1"); 
     request.Headers["Host"] = "xyz.net"; 
WebResponse response = request.GetResponse(); 

しかし、それはエラーを与える:

ArgumentException: restricted header

私がホストを変更することができますどのような方法があり、いくつかのヘッダは、.NET 2.0 で変更することができないようですまたはより高いバージョンに一致して.netバージョンを変更しますか?

+0

[HttpWebRequestのカスタム "ホスト"ヘッダーを設定する方法](https://stackoverflow.com/questions/1450937/how-to-set-custom-host-header-in-httpwebrequest) – joreldraw

+0

@ joreldrawこれはUnityです。リフレクションを使用しているので動作しないものはありません – Programmer

+0

[System.Net.WebRequestを使用しているときにHTTPヘッダーを設定できません](https://stackoverflow.com/questions/239725/cannot-set-some-http-headers-利用時システムネットネットリクエスト) – Foggzie

答えて

2

これを反映させることができます。残念ながら、UnityがMonoを使用しており、変数名が全く異なるため、GetFieldがヘッダーを保持する変数を見つけることができないため、同様の質問からのC#の回答は一切ありません。

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でテストされています。ユニティバージョンと、変数名が将来変更されたときに誰でも簡単に修正できるように、フィールド名をどのように見つけたのかを言及しました。

関連する問題