2013-02-20 26 views

回答

13

回想一下,模塊可以訂閱不同的管道事件。在任何給定的管道事件中,模塊應該按照它們在Modules集合中指定的順序運行。

作爲一個實際的例子中,假設模塊集合,其具有登記的這三個模塊:

  • 模塊A,其預訂EndRequest
  • 模塊B,其中所預訂的BeginRequest和EndRequest
  • 模塊C ,其預訂AuthenticateRequest

執行的順序將是:

  1. 模塊B,的BeginRequest
  2. 模塊C,AuthenticateRequest
  3. 模塊A,EndRequest
  4. 模塊B,EndRequest

由於FormsAuthenticationModule訂閱了AuthenticateRequest事件,考慮讓自己的模塊訂閱到PostAuthenticateRequest事件。這樣可以保證,如果FormsAuthenticationModule邏輯運行,它將在您的邏輯之前運行,而不管它們在Modules集合中註冊的順序如何。

+1

我明白你的意思,但因爲我的模塊有撤消什麼FormsAuthenticationModule在做,我不能用'PostAuthenticateRequest'其'EndRequest'處理程序,所以我絕對必須在我的模塊的'EndRequest'處理程序中擁有我的代碼。 – sharptooth 2013-02-20 11:24:22

+0

你能解釋一下你究竟想要做什麼嗎?如果您試圖壓制FormsAuthenticationModule的自動「將401轉變爲重定向」行爲,請在請求期間的某個時間點設置HttpResponse.SuppressFormsAuthenticationRedirect = true。 – Levi 2013-02-20 18:09:01

+0

該屬性僅出現在ASP.NET 4.5中。是的,我試圖壓制那件事。 – sharptooth 2013-02-21 06:13:08

2

我會盡力回答它。

我不認爲你應該依賴於HttpContext.Current.ApplicationInstance.Modules集合,因爲你現在要做哪個模塊的順序執行。

請注意,我沒有做任何原型,這只是我的想法。

該DLL Microsoft.Web.Infrastructure.dll具有用於寄存器的方法動態HTTP模塊

DLL被隨網頁1.0

登記

public static class RegisterHttpModuleHelper 
{ 

    public static void Start() 
    { 

     DynamicModuleUtility.RegisterModule(typeof(YourCustomModule)); 
    } 
} 

FormsAuthenticationModule具有創建輔助類事件「驗證」。

在此事件的處理程序,儘量dynamicaly註冊您的自定義HTTP模塊使用

public void FormsAuthentication_OnAuthenticate(object sender, FormsAuthenticationEventArgs args) 
{ 
    RegisterHttpModuleHelper.Start() 
} 
相關問題