Can I be sure that HttpModules are executed in the order in which they are listed in the HttpApplication.Modules collection?

拈花ヽ惹草 提交于 2019-12-04 18:03:50

问题


I want to write an IHttpModule that has to be executed strictly after FormsAuthenticationModule, otherwise it will be useless.

There's HttpContext.Current.ApplicationInstance.Modules property that returns a collection of IHttpModules. I can check that my module is after FormsAuthenticationModule in this collection.

Will that be enough? Does that collection list IHttpModules in the order in which they are executed?


回答1:


Recall that modules can subscribe to different pipeline events. Within any given pipeline event, modules should run in the order in which they're specified in the Modules collection.

As a practical example, imagine a Modules collection which has these three modules registered:

  • Module A, which subscribes to EndRequest
  • Module B, which subscribes to BeginRequest and EndRequest
  • Module C, which subscribes to AuthenticateRequest

The order of execution will be:

  1. Module B, BeginRequest
  2. Module C, AuthenticateRequest
  3. Module A, EndRequest
  4. Module B, EndRequest

Since the FormsAuthenticationModule subscribes to the AuthenticateRequest event, consider making your own module subscribe to the PostAuthenticateRequest event. That way you're guaranteed that if the FormsAuthenticationModule logic runs, it runs before your logic, regardless of the order in which they're registered in the Modules collection.




回答2:


I will try to answer it .

I do not think you should rely on HttpContext.Current.ApplicationInstance.Modules collection, because you do now in which order module will be executed.

Please note that I did't do any prototype, it's just my thought .

The dll Microsoft.Web.Infrastructure.dll has a method for register dynamically HTTP module

The dll is shipped with WebPages 1.0

Create helper class for registration

public static class RegisterHttpModuleHelper
{

    public static void Start()
    {

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

FormsAuthenticationModule has event "Authenticate".

On hander of this event , try to dynamicaly register your Custom HttpModule using

public void FormsAuthentication_OnAuthenticate(object sender, FormsAuthenticationEventArgs args)
{
    RegisterHttpModuleHelper.Start()
}


来源:https://stackoverflow.com/questions/14973667/can-i-be-sure-that-httpmodules-are-executed-in-the-order-in-which-they-are-liste

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!