2010-10-20 58 views
4

我正在嘗試使用C#修改HTTP頭。我試圖在頁面preinit事件上操作Request.Headers。但是,當我嘗試設置任何標題,我得到PlatformNotSupportedException。既然我們不能設置一個新的NameValueCollection到Reqeust.Headers,我試圖設置使用值下面的代碼:如何使用C#修改請求的HTTP標頭?

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

不知道如何才能實現這一目標?

+0

你真的需要設置請求(=接收)值,或者更確切地說,響應一個(=離開)? – 2010-10-20 10:11:29

+0

傳入..不會出去.. :) – Amit 2010-10-20 12:42:55

回答

10

試試這個:

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

編輯: 這可能是你的理由: http://bigjimindc.blogspot.com/2007/07/ms-kb928365-aspnet-requestheadersadd.html

有一個代碼片段中的是,它增加了一個新的頭到Request.Headers。在Windows 7 32位操作系統上也進行了驗證。

但你可能要更換線路:

HttpApplication objApp = (HttpApplication)r_objSender; 

有:

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

編輯: 要替換現有的頭值,使用:

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

其中「主機」是標題名稱。

+0

我得到PlatformNotSupportedException。我使用Windows 7 32位與IIS 7.5 – Amit 2010-10-20 07:14:41

+1

@Amit:您使用哪個.Net框架? – Kay 2010-10-20 08:50:59

+0

我在Win Server 2008,IIS 7,.Net Framework 3.5 SP1上使用了上述代碼;和它很好地工作 – Kay 2010-10-20 08:51:50

3

從鏈接博客添加完整的(工作)的代碼 - 櫃面該博客消失

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