asp.net - ¿Puedo estar seguro de que los HttpModules se ejecutan en el orden en que se enumeran en la colección HttpApplication.Modules?
iis (2)
Intentaré responderlo.
No creo que deba confiar en la colección HttpContext.Current.ApplicationInstance.Modules, porque lo hace ahora en qué módulo de orden se ejecutará.
Tenga en cuenta que no hice ningún prototipo, es solo mi pensamiento.
El dll Microsoft.Web.Infrastructure.dll tiene un método para registrar dinámicamente el módulo HTTP
El dll se envía con WebPages 1.0
Crear clase de ayuda para el registro
public static class RegisterHttpModuleHelper
{
public static void Start()
{
DynamicModuleUtility.RegisterModule(typeof(YourCustomModule));
}
}
FormsAuthenticationModule tiene el evento "Autenticar".
En la mano de este evento, intente registrar dinámicamente su HttpModule personalizado usando
public void FormsAuthentication_OnAuthenticate(object sender, FormsAuthenticationEventArgs args)
{
RegisterHttpModuleHelper.Start()
}
Quiero escribir un IHttpModule
que debe ejecutarse estrictamente después de FormsAuthenticationModule
; de lo contrario, será inútil.
Existe la propiedad HttpContext.Current.ApplicationInstance.Modules
que devuelve una colección de IHttpModule
s. Puedo verificar que mi módulo esté después de FormsAuthenticationModule
en esta colección.
¿Será eso suficiente? ¿ IHttpModule
colección incluye IHttpModule
s en el orden en que se ejecutan?
Recuerde que los módulos pueden suscribirse a diferentes eventos de canalización. Dentro de cualquier evento de canalización, los módulos deben ejecutarse en el orden en que se especifican en la colección Módulos.
Como ejemplo práctico, imagine una colección de Módulos que tenga registrados estos tres módulos:
- Módulo A, que se suscribe a EndRequest
- Módulo B, que se suscribe a BeginRequest y EndRequest
- Módulo C, que se suscribe a AuthenticateRequest
El orden de ejecución será:
- Módulo B, BeginRequest
- Módulo C, AuthenticateRequest
- Módulo A, EndRequest
- Módulo B, EndRequest
Dado que FormsAuthenticationModule se suscribe al evento AuthenticateRequest, considere hacer que su propio módulo se suscriba al evento PostAuthenticateRequest. De esta manera, se garantiza que, si se ejecuta la lógica FormsAuthenticationModule, se ejecuta antes de su lógica , independientemente del orden en el que están registrados en la colección de Módulos.