2010-10-20 6 views
4

J'essayais de modifier un en-tête HTTP en utilisant C#. J'ai essayé de manipuler l'événement Request.Headers sur la page preinit. Mais quand j'essaye de placer n'importe quoi aux en-têtes, j'obtiens l'exception de PlatformNotSupportedException. Puisque nous ne pouvons pas établir un nouveau NameValueCollection à Reqeust.Headers, j'ai essayé de définir la valeur en utilisant le code suivant:Comment modifier l'en-tête HTTP d'une requête en utilisant C#?

Request.Headers.Set(HttpRequestHeader.UserAgent.ToString(), "some value"); 

Toute idée de comment cela peut-il être atteint?

+0

Avez-vous vraiment besoin de régler la demande (= entrant) valeur, ou plutôt la réponse un (= sortant)? –

+0

Entrant .. pas sortant .. :) – Amit

Répondre

10

Essayez ceci:

HttpContext.Current.Request.Headers["User-Agent"] = "Some Value"; 

EDIT: Cela pourrait être la raison: http://bigjimindc.blogspot.com/2007/07/ms-kb928365-aspnet-requestheadersadd.html

Il y a un extrait de code en ce qui ajoute un nouvel en-tête aux Request.Headers. Vérifié sur Windows 7 OS 32 bits aussi.

Mais vous voudrez peut-être remplacer la ligne:

HttpApplication objApp = (HttpApplication)r_objSender; 

avec:

HttpApplication objApp = (HttpApplication)HttpContext.Current.ApplicationInstance; 

EDIT: Pour remplacer la valeur d'en-tête existante, utilisez:

t.InvokeMember("BaseSet", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance, null, headers, new object[] { "Host", item }); 

où "Host" est un nom d'en-tête.

+0

Je reçois PlatformNotSupportedException. J'utilise Windows 7 32 bits avec IIS 7.5 – Amit

+1

@Amit: Quel framework .Net utilisez-vous? – Kay

+0

J'ai utilisé le code ci-dessus sur Win Server 2008, IIS 7, .Net Framework 3.5 SP1; et cela a bien fonctionné – Kay

3

Ajout du complet (travail) Code du blog lié - Incase ce blog disparaît

HttpApplication objApp = (HttpApplication)HttpContext.Current.ApplicationInstance; 
HttpRequest Request = (HttpContext)objApp.Context.Request; 

//get a reference 
NameValueCollection headers = Request.Headers; 

//get a type 
Type t = headers.GetType(); 
System.Collections.ArrayList item = new System.Collections.ArrayList(); 

t.InvokeMember("MakeReadWrite",BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance,null,headers,null); 
t.InvokeMember("InvalidateCachedArrays",BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance,null,headers,null); 
item.Add("CUSTOM_HEADER_VALUE"); 
t.InvokeMember("BaseAdd",BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance,null,headers, new object[]{"CUSTOM_HEADER_NAME",item}); 
t.InvokeMember("MakeReadOnly",BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance,null,headers,null); 
Questions connexes