asp.net - una - Avanzado: ¿Cuántas veces se llama al método HttpModule Init() durante la vida de la aplicación?
select asp-for asp-items (2)
La inicialización de la aplicación web es la siguiente:
- Como sabemos cuando IIS recibe la primera solicitud de un recurso de aplicación Asp.net en particular, IIS crea una instancia de una aplicación
HttpApplication
(definida en elglobal.asax
global.asax detrás). - Cuando se crea esta nueva instancia, ocurre una inicialización que también verifica todos los módulos HTTP configurados.
- Todos los módulos se instancian y se colocan en la colección de
Modules
la aplicación (de tipoHttpModuleCollection
) - los módulos se pasan por bucle y se llama a su método
Init()
(cuando se registran para eventos de solicitud)
Por lo que yo entiendo, el escenario anterior ocurre cuando se inicia / inicializa una aplicación web (de ahí el evento de inicio de la aplicación).
¿Qué pasa con los módulos?
¿Se (re) instalan en cada solicitud o se reutilizan desde la propiedad Modules
en cada solicitud consecutiva mientras la aplicación web está activa? Según entiendo, IIS y Asp.net se reutilizan durante toda la vida de una aplicación web.
Si se reutilizan, ¿podemos suponer que su método Init()
es realmente un controlador de pseudo evento para el evento de inicio de la aplicación? El problema es que no podemos adjuntar eventos de nivel de aplicación dentro de módulos http. Pero si se vuelven a utilizar, podríamos usar Init()
como evento de inicio de la aplicación y hacer lo que pondríamos en global.asax
.
Pregunta
¿Podemos suponer que el método Init()
del módulo se llama solo en el evento de inicio de la aplicación? ¿Podríamos usar esta suposición para, por ejemplo, registrar rutas para aplicaciones cuyo global.asax
global.asax detrás no podemos cambiar? web.config
suele ser accesible y podemos cambiarlo de la manera que deseemos.
¿Esto realmente funcionaría?
información adicional
Podemos verificar el código HttpApplication
y verificar su método InitModulesCommon()
. Éste en realidad llama a Init()
de cada módulo HTTP registrado. Lo que es más interesante es que este método solo lo utilizan los InitIntegratedModules()
y InitModules()
. Ambos se usan solo en el método HttpApplication.InitInternal()
. Esta es la base de mis suposiciones, pero me gustaría saber si alguien ha abusado de IHttpModule.Init()
para el evento de inicio de la aplicación.
Init()
se llama solo una vez (por instancia de HttpApplication
)
Después de probar esto, el funcionamiento interno de la inicialización de IHttpModule
es el siguiente:
- Cada
IHttpModule
se inicializa en el inicio de la aplicación web instalando y una llamada al métodoInit()
-
HttpApplication
almacena todas las instancias de módulo en su propiedad deModules
- Los módulos se reutilizan durante toda la vida de una aplicación
HttpApplication
y no se descartan / reinician mientras la aplicación esté activa.
Entonces, el mejor resultado es
No puede adjuntar un IHttpModule
a eventos de nivel de aplicación, pero puede usar su método Init()
como delegado de evento de inicio de pseudo aplicación . Dentro de él, puede ejecutar cualquier código que normalmente colocaría dentro del delegado Application_Start
en su Global.asax
.
También puede leer información detallada al respecto en mi publicación de blog .
Pero tenga cuidado en el entorno del servidor web de la vida real
Pero IIS usa algo llamado pools de aplicaciones . Y cada grupo puede tener un número arbitrario de instancias de HttpApplication
. Sí, múltiple. El inicio de la aplicación crea todas estas instancias. Cada uno de ellos inicializa su propia lista de módulos, pero solo el primero ejecuta el controlador de eventos Application_OnStart
.
Por lo tanto, cada vez que su módulo modifique algún recurso común compartido, debe tomar medidas adicionales para indicar que el primer módulo lo hizo y otros no lo harán nuevamente. Lea una publicación de blog adicional que le mostrará cómo y cuándo usar el bloqueo de subprocesos con su módulo para que realmente actúe como un controlador de eventos Application_OnStart
. Por cierto: también es posible manejar el evento Application_OnEnd
si es necesario. ;)
Enlaces detallados de publicaciones de blog
Application_Start solo se ejecuta una vez durante la vida de su aplicación.
IHttpModule.Init se ejecuta para cada instancia de HttpApplication, antes de que comience el proceso de solicitud. Ver el walkthrough . Init es donde puede registrar los eventos utilizados para procesar la solicitud.
Una instancia de HttpApplication puede reutilizarse para múltiples solicitudes. ASP.Net agrupa objetos HttpApplication, por lo que se llamará Init una vez para cada instancia nueva de HttpApplication