12

IHttpModule厳密に実行しなければならないを書きたいのですがFormsAuthenticationModule、そうでないと意味がありません。

HttpContext.Current.ApplicationInstance.Modulesコレクションを返すプロパティがありますIHttpModule。私のモジュールがFormsAuthenticationModuleこのコレクションの後にあることを確認できます。

それで十分でしょうか?IHttpModuleそのコレクションは、実行された順序でリストされていますか?

4

2 に答える 2

16

モジュールはさまざまなパイプラインイベントをサブスクライブできることを思い出してください。特定のパイプラインイベント内で、モジュールはModulesコレクションで指定された順序で実行する必要があります。

実際の例として、次の3つのモジュールが登録されているModulesコレクションを想像してみてください。

  • EndRequestをサブスクライブするモジュールA
  • BeginRequestとEndRequestをサブスクライブするモジュールB
  • AuthenticateRequestをサブスクライブするモジュールC

実行順序は次のとおりです。

  1. モジュールB、BeginRequest
  2. モジュールC、AuthenticateRequest
  3. モジュールA、EndRequest
  4. モジュールB、EndRequest

FormsAuthenticationModuleはAuthenticateRequestイベントをサブスクライブするため、独自のモジュールをPostAuthenticateRequestイベントをサブスクライブすることを検討してください。これにより、FormsAuthenticationModuleロジックが実行される場合、Modulesコレクションに登録されている順序に関係なく、ロジックの前に実行されることが保証されます。

于 2013-02-20T07:07:01.323 に答える
2

私はそれに答えようとします。

モジュールが実行される順序を指定しているため、HttpContext.Current.ApplicationInstance.Modulesコレクションに依存する必要はないと思います。

私はプロトタイプを作成しなかったことに注意してください。それは私の考えです。

dll Microsoft.Web.Infrastructure.dllには、動的にHTTPモジュールを登録するためのメソッドがあります。

dllはWebPages1.0に同梱されています

登録用のヘルパークラスを作成する

public static class RegisterHttpModuleHelper
{

    public static void Start()
    {

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

FormsAuthenticationModuleにはイベント「Authenticate」があります。

このイベントを利用して、カスタムHttpModuleを動的に登録してみてください

public void FormsAuthentication_OnAuthenticate(object sender, FormsAuthenticationEventArgs args)
{
    RegisterHttpModuleHelper.Start()
}
于 2013-02-20T07:08:26.590 に答える