Este artículo es un artículo espejo de traducción automática, por favor haga clic aquí para saltar al artículo original.

Vista: 16308|Respuesta: 0

[ASP.NET] [Mito] ¿Se ejecutará el método Init del objeto HttpApplication solo una vez?

[Copiar enlace]
Publicado en 6/2/2017 17:29:28 | | | |
Descubrí que muchos amigos, como yo, usamos por error IHttpModule.Init como una alternativa Application_Start para hacer algunas operaciones de inicialización de aplicaciones en él.
Sin embargo, la naturaleza de los eventos de Application_Start en IHttpModule.Init y Global.asax es diferente, y en IHttpModule.Init no puede usarse directamente para reemplazar Application_Start ASP.NET el proceso de inicialización de la aplicación. Tampoco puede usarse simplemente para concluir que el método Init se llama repetidamente para concluir que ASP.NET programa ha sido reiniciado.
La razón es que IHttpModule.Init puede ser llamado varias veces al responder a una solicitud ASP.NET, y es muy probable que ocurra durante la operación real del sitio web.
¿Por qué se llama a IHttpModule.Init varias veces? Porque cada instancia de HttpApplication solo puede gestionar una solicitud a la vez, y ASP.NET soporta un cierto número de solicitudes concurrentes, por lo que la instancia de HttpApplication se creará varias veces para responder a diferentes solicitudes cuando no basta con responder a solicitudes concurrentes. Cada instancia de HttpApplication crea un nuevo conjunto de HttpModules y llama al método Init tras ser creada.
Application_Start solo se llamará después de que se cree el primer objeto HttpApplication, y las instancias HttpApplication posteriores no activarán este evento.
Creo que la reutilización de instancias de HttpApplication es una de las principales razones del malentendido sobre el uso del método Init de IHttpModule, porque normalmente solo tenemos una petición al depurar un programa, y es básicamente imposible ejecutar repetidamente el método Init de HttpModule. En el entorno real de ejecución de sitios web, las solicitudes concurrentes son comunes, y si el método Init se usa indebidamente, puede causar problemas extraños en el entorno real.
Para detalles específicos, consulte el "Resumen del ciclo de vida de la ASP.NET aplicación para IIS 5.0 y 6.0" de MSDN, que proporciona imágenes en el artículo:
También puedes usar Refelector para descompilar el ensamblador System.Web y analizar la relación de llamada del método IHttpModule.Init.
Acabarás con el método System.Web.HttpApplicationFactory.GetNormalApplicationInstance, que muestra cómo se reutilizan y crean las instancias de HttpApplication.
En resumen, IHttpModule.Init no puede usarse simplemente como sustituto de Application_Start.
Una forma relativamente sencilla es usar un campo de tipo bool estático como etiqueta de inicialización, y establecer la marca en verdadero tras la inicialización requerida por el programa en HttpModule, y no repetir la inicialización la próxima vez.
Sin embargo, código como registrar el evento BeginRequest sigue teniendo que ejecutarse cada vez que se ejecuta Init, porque la instancia del HttpModule en este momento es diferente; si juzgas el campo de marcado de inicialización estática sin repetir el evento de registro, puede derivar en problemas extraños como reescritura de URLs a veces ejecutada y otras veces no.

[Mito] ¿Se ejecutará el método Init del objeto HttpApplication solo una vez?

Respuesta: Se ejecutará varias veces!!!!





Anterior:Utiliza InternalsVisibleTo para añadir "ensamblador amigo" al ensamblador
Próximo:Concurso de regex en Java para seleccionar un número bonito
Renuncia:
Todo el software, materiales de programación o artículos publicados por Code Farmer Network son únicamente para fines de aprendizaje e investigación; El contenido anterior no se utilizará con fines comerciales o ilegales; de lo contrario, los usuarios asumirán todas las consecuencias. La información de este sitio proviene de Internet, y las disputas de derechos de autor no tienen nada que ver con este sitio. Debes eliminar completamente el contenido anterior de tu ordenador en un plazo de 24 horas desde la descarga. Si te gusta el programa, por favor apoya el software genuino, compra el registro y obtén mejores servicios genuinos. Si hay alguna infracción, por favor contáctanos por correo electrónico.

Mail To:help@itsvse.com