2017-10-10 7 views
1

Je souhaite appeler une page Web par son adresse IP en ajoutant des valeurs personnalisées pour demander l'en-tête de «hôte». «
» Code:Modifier les en-têtes HttpWebRequest restreints dans Unity

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

Mais il donne une erreur:

ArgumentException: restricted header

Il semble que certains en-têtes ne peuvent pas être modifiés dans .net 2.0 donc est-il possible que je peux changer l'hôte ou changer la version .net dans l'unité à la version supérieure?

+0

Copie possible de [Comment définir l'en-tête "Host" personnalisé dans HttpWebRequest?] (Https://stackoverflow.com/questions/1450937/how-to-set-custom-host-header-in-httpwebrequest) – joreldraw

+0

@ joreldraw C'est l'unité. Aucun d'entre eux ne devrait fonctionner car il utilise la réflexion – Programmer

+0

Copie possible de [Impossible de définir certains en-têtes HTTP lors de l'utilisation de System.Net.WebRequest] (https://stackoverflow.com/questions/239725/cannot-set-some-http-headers- when-using-system-net-webrequest) – Foggzie

Répondre

2

Vous pouvez le faire avec la réflexion. Malheureusement, aucune des réponses C# provenant de questions similaires ne fonctionne car Unity utilise Mono et leurs noms de variables sont totalement différents, ce qui rend impossible la recherche de la variable qui contient les en-têtes.

Vider tous les en-têtes dans la classe HttpWebRequest avec HttpWebRequest.GetType().GetFields puis recherchez le nom du champ qui contient les en-têtes. Dans mon test, le nom du champ est "webHeaders" et est un type de WebHeaderCollection.

Ci-dessous est une méthode d'extension qui modifie que "webHeaders" de la réflexion:

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); 
    } 
} 

USAGES:

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(); 

Cela devrait fonctionner pour l'en-tête restreint comme User-Agent. Testé avec Unity 2017.2. Mentionné la version Unity et comment j'ai trouvé le nom du champ de sorte que lorsque le nom de la variable change dans le futur, n'importe qui peut simplement le réparer.