我可以确定HttpModules是按照它们在HttpApplication.Modules集合中列出的顺序执行的吗?

时间:2013-02-20 06:34:54

标签: asp.net .net iis httpmodule

我想写一个必须在IHttpModule之后严格执行的FormsAuthenticationModule,否则它将毫无用处。

HttpContext.Current.ApplicationInstance.Modules属性可返回IHttpModule的集合。我可以检查我的模块是否在此集合中FormsAuthenticationModule之后。

这还够吗?该集合是否按照执行顺序列出IHttpModule

2 个答案:

答案 0 :(得分:14)

回想一下,模块可以订阅不同的管道事件。在任何给定的管道事件中,模块应按照在Modules集合中指定的顺序运行。

作为一个实际的例子,想象一下模块集合,它注册了这三个模块:

  • 模块A,订阅EndRequest
  • 模块B,订阅BeginRequest和EndRequest
  • 模块C,订阅AuthenticateRequest

执行顺序为:

  1. 模块B,BeginRequest
  2. 模块C,AuthenticateRequest
  3. 模块A,EndRequest
  4. 模块B,EndRequest
  5. 由于FormsAuthenticationModule订阅了AuthenticateRequest事件,因此请考虑让您自己的模块订阅PostAuthenticateRequest事件。这样,您可以保证,如果FormsAuthenticationModule逻辑运行,它将在您的逻辑之前运行,而不管它们在Modules集合中的注册顺序。

答案 1 :(得分:2)

我会尽力回答。

我认为你不应该依赖于HttpContext.Current.ApplicationInstance.Modules集合,因为你现在在执行哪个命令模块。

请注意,我没有做任何原型,这只是我的想法。

dll Microsoft.Web.Infrastructure.dll有一个动态注册HTTP模块的方法

dll随WebPages 1.0一起提供

创建注册的辅助类

public static class RegisterHttpModuleHelper
{

    public static void Start()
    {

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

FormsAuthenticationModule具有“Authenticate”事件。

在处理此事件时,尝试使用

动态注册您的Custom HttpModule
public void FormsAuthentication_OnAuthenticate(object sender, FormsAuthenticationEventArgs args)
{
    RegisterHttpModuleHelper.Start()
}