2013-02-20 65 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() 
} 
相关问题