vista una tag que parcial net mvc for asp asp.net events httpmodule

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:

  1. 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 el global.asax global.asax detrás).
  2. Cuando se crea esta nueva instancia, ocurre una inicialización que también verifica todos los módulos HTTP configurados.
  3. Todos los módulos se instancian y se colocan en la colección de Modules la aplicación (de tipo HttpModuleCollection )
  4. 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:

  1. Cada IHttpModule se inicializa en el inicio de la aplicación web instalando y una llamada al método Init()
  2. HttpApplication almacena todas las instancias de módulo en su propiedad de Modules
  3. 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

  1. Escribir un IHttpModule personalizado que maneje el evento Application_OnStart
  2. Cómo usar IHttpModule correctamente para manejar el evento Application_OnStart

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