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

12
我希望写一个实现了 IHttpModule 接口的模块,但该模块必须在FormsAuthenticationModule执行之后严格执行,否则就会无效。
可以使用 HttpContext.Current.ApplicationInstance.Modules 属性返回一个IHttpModule 的集合。在这个集合中检查我的模块是否在 FormsAuthenticationModule 之后。
这样就足够了吗?这个集合是否列出了按执行顺序排列的 IHttpModule
2个回答

16

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

作为一个实际的例子,假设有这三个模块注册到 Modules 集合中:

  • Module A,订阅 EndRequest 事件
  • Module B,同时订阅 BeginRequest 和 EndRequest 事件
  • Module C,订阅 AuthenticateRequest 事件

执行顺序将是:

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

由于 FormsAuthenticationModule 订阅了 AuthenticateRequest 事件,请考虑使您自己的模块订阅 PostAuthenticateRequest 事件。这样,无论它们在 Modules 集合中注册的顺序如何,都可以确保如果 FormsAuthenticationModule 逻辑运行,则在您的逻辑之前运行。


1
我理解你的观点,但是我不能使用 PostAuthenticateRequest,因为我的模块必须在 EndRequest 处理程序中撤销 FormsAuthenticationModule 所做的操作,所以我绝对必须将我的代码放在我的模块的 EndRequest 处理程序中。 - sharptooth
你能解释一下你想做什么吗?如果你想抑制FormsAuthenticationModule自动将401转换为重定向的行为,那么在请求期间的某个时刻设置HttpResponse.SuppressFormsAuthenticationRedirect = true。 - Levi
那个属性只出现在ASP.NET 4.5中。是的,我正在尝试压制确切的那个东西。 - sharptooth

2

我会尽力回答。

我认为您不应该依赖HttpContext.Current.ApplicationInstance.Modules集合,因为您不知道模块将按何顺序执行。

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

Microsoft.Web.Infrastructure.dll中有一种方法可以动态注册HTTP模块。

该dll与WebPages 1.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()
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接