2010-11-03 137 views
10

這似乎是一個簡單的操作。HttpModule向請求添加標頭

我們有必要在我們的開發環境(在XP/IIS 5上運行)以一些頭添加到每個HttpRequest的到達我們的應用程序。 (這是爲了模擬我們在dev中沒有的生產環境)。乍一看,這似乎是一個簡單的HttpModule,沿着線:

public class Dev_Sim: IHttpModule 
{ 
    public void Init(HttpApplication app) 
    { 
     app.BeginRequest += delegate { app.Context.Request.Headers.Add("UserName", "XYZZY"); }; 
    } 

    public void Dispose(){} 
} 

但在試圖做到這一點,我發現請求的頭集合是隻讀的,而Add方法失敗一個OperationNotSupported異常。

花費一兩個小時在谷歌研究這個,我來了,沒有簡單的答案,什麼應該是一個比較直接的問題。

有沒有人有任何指針?

+0

有能力修改響應流。你有什麼具體的東西可以得到處理和替換? – brumScouse 2010-11-03 20:10:31

+0

我不想修改迴應。我需要修改請求,並將其發送到鏈的其餘部分,最終以我的MVC應用程序結束。當它到達我的應用程序時,我的應用程序必須能夠看到我試圖在此模塊中插入的標題。 – 2010-11-03 21:32:38

回答

15

好,有同事和一些實驗的幫助下,我發現,這可能與部分受保護的屬性和方法通過反射訪問的幫助來完成:

var headers = app.Context.Request.Headers; 
Type hdr = headers.GetType(); 
PropertyInfo ro = hdr.GetProperty("IsReadOnly", 
    BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.IgnoreCase | BindingFlags.FlattenHierarchy); 
// Remove the ReadOnly property 
ro.SetValue(headers, false, null); 
// Invoke the protected InvalidateCachedArrays method 
hdr.InvokeMember("InvalidateCachedArrays", 
    BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance, 
    null, headers, null); 
// Now invoke the protected "BaseAdd" method of the base class to add the 
// headers you need. The header content needs to be an ArrayList or the 
// the web application will choke on it. 
hdr.InvokeMember("BaseAdd", 
    BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance, 
    null, headers, 
    new object[] { "CustomHeaderKey", new ArrayList {"CustomHeaderContent"}}); 
// repeat BaseAdd invocation for any other headers to be added 
// Then set the collection back to ReadOnly 
ro.SetValue(headers, true, null); 

這對我的作品,至少。

+0

我們有一個贏家! – 2016-01-06 03:00:39

+0

這是錯的。我用它來爲請求添加參數(它們也是隻讀的)。在這種情況下,不需要將它作爲ArrayList的值 - 只是一個字符串。 +1 – iandisme 2016-10-27 14:35:39

+0

太棒了!我用這個來創建一個擴展方法,當我需要爲我的測試添加一個頭部到一個HttpRequest。 https://gist.github.com/mrstebo/81288a96f55c0b74f6c5b37ee17533a6 – mrstebo 2017-04-12 10:56:18

0

您可以添加到頁眉這種方式。這是在輸入認證序列之前向請求添加憑證信息的一種方式。

string cred = "UN:PW"; 
System.Web.HttpContext.Current.Request.Headers.Add("Authorization", "Basic " +Convert.ToBase64String(Encoding.ASCII.GetBytes(cred))); 
+2

我不確定,而且,由於這是一年半之後,我還沒有一個測試環境來嘗試它,但我相信你會發現Headers.Add和OperationNotSupported異常都會失敗,就像它在我的原始示例中那樣。我可能是錯的... – 2012-02-22 16:13:28

+0

我試過這種方法,並得到了相同的OperationNotSupported異常戴夫漢娜的解決方案爲我工作 – Franklin 2016-05-23 15:48:38