Как изменить заголовок HTTP запроса с помощью C #? - PullRequest
4 голосов
/ 20 октября 2010

Я пытался изменить заголовок HTTP с помощью C #. Я пытался манипулировать событием Request.Headers on Page preinit. Но когда я пытаюсь установить что-либо для заголовков, я получаю исключение PlatformNotSupportedException. Поскольку мы не можем установить новое NameValueCollection в Reqeust.Headers, я попытался установить значение, используя следующий код:

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

Есть идеи, как этого достичь?

Ответы [ 2 ]

11 голосов
/ 20 октября 2010

Попробуйте это:

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

EDIT: Это может быть вашей причиной: http://bigjimindc.blogspot.com/2007/07/ms-kb928365-aspnet-requestheadersadd.html

В этом есть фрагмент кода, который добавляет новый заголовок в Request.Headers. Проверено на 32-битной ОС Windows 7 тоже.

Но вы можете заменить строку:

HttpApplication objApp = (HttpApplication)r_objSender;

с:

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

EDIT: Чтобы заменить существующее значение заголовка, используйте:

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

где "Host" - это имя заголовка.

3 голосов
/ 09 ноября 2012

Добавление полного (рабочего) кода из связанного блога - в случае, если блог исчезает

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