8.2 Ciclo de vida de la aplicación y canalización ASP.NET
La Sección 8.1 presenta la arquitectura del sistema de IIS y el proceso general de procesamiento de solicitudes HTTP. A partir de ella, podemos saber que cada sitio web ASP.NET corresponde a una aplicación web, que puede responder a las solicitudes HTTP y proporcionar a los usuarios la información requerida. Entonces, ¿cómo responde exactamente una aplicación ASP.NET a las solicitudes HTTP? ¿Qué procedimientos de procesamiento específicos están incluidos? Esto involucra el ciclo de vida de las aplicaciones ASP.NET.
8.2.1 Ciclo de vida de la aplicación ASP.NET*
Esta sección toma IIS 6 como ejemplo para presentar paso a paso el proceso de procesamiento de solicitudes HTTP por parte de aplicaciones ASP.NET. El proceso de IIS 7 tiene algunos cambios menores en comparación con IIS 6, pero en general es consistente.
1 El navegador emite una solicitud HTTP para acceder a una página web ASP.NET.
Supongamos que esta solicitud es la primera solicitud a la aplicación ASP.NET a la que pertenece esta página web.
Cuando esta solicitud llega al servidor web, HTTP.SYS es responsable de recibirla. Según la URL de esta solicitud, HTTP.SYS la pasa al grupo de aplicaciones correspondiente a esta aplicación ASP.NET y al grupo de aplicaciones que se ejecuta en esta aplicación. Los procesos de trabajo del grupo son responsables de procesar las solicitudes [1].
Después de que el proceso de trabajo recibe esta solicitud, carga una extensión ISAPI "aspnet_isapi.dll" dedicada a procesar páginas ASP.NET y le pasa la solicitud HTTP.
Después de que el proceso de trabajo carga aspnet_isapi.dll, aspnet_isapi.dll es responsable de cargar el entorno de ejecución de la aplicación ASP.NET: CLR [2].
El proceso de trabajo funciona en un entorno no administrado (en referencia al propio sistema operativo Windows), mientras que los objetos en .NET funcionan en un entorno administrado (en referencia a CLR) actúa como un puente para la comunicación HTTP entre los dos. las solicitudes recibidas (desde un entorno no administrado) se reenvían al objeto .NET correspondiente (en un entorno administrado) para su procesamiento.
2 Cree el objeto ApplicationManager y el dominio de la aplicación.
Una vez cargado CLR, la clase ApplicationManager es responsable de crear un dominio de aplicación. Cada aplicación ASP.NET se ejecuta en su propio dominio de aplicación y se identifica mediante un identificador de aplicación único.
Cada dominio de aplicación corresponde a una instancia de la clase ApplicationManager, que es responsable de administrar las aplicaciones ASP.NET que se ejecutan en el dominio (como iniciar y detener una aplicación ASP.NET, crear objetos en una aplicación ASP.NET específica, etc.) .
3 Crear objeto HostingEnvironment
Al crear un dominio de aplicación para una aplicación ASP.NET, se crea un objeto HostingEnvironment, que proporciona cierta información de administración para la aplicación ASP.NET (como la identidad de la aplicación ASP.NET, el directorio virtual correspondiente y el directorio físico). y proporciona algunas funciones adicionales (como registrar un objeto en el dominio de la aplicación, hacerse pasar por un usuario específico, etc.).
4 Cree objetos ASP.NET Core para cada solicitud
Cuando se crea el dominio de la aplicación, se crea un objeto ISAPIRuntime y se llama automáticamente a su método ProcessRequest(). En este método, el objeto ISAPIRuntime crea un objeto HttpWorkerRequest basado en la solicitud HTTP entrante. Este objeto encapsula diversa información de la solicitud HTTP de forma orientada a objetos (es decir, la información de la solicitud HTTP original se encapsula como un objeto HttpWorkerRequest). Luego, llame al método StartProcessing () del objeto ISAPIRuntime para iniciar todo el proceso de procesamiento de solicitudes HTTP (este es el "HTTP Pipeline: HTTP Pipeline" al comienzo de este proceso de procesamiento, se crea un objeto de tipo HttpRuntime y el El objeto HttpWorkerRequest creado previamente se utiliza como Los parámetros del método se pasan al método ProcessRequest() de este objeto HttpRuntime.
Se realizan trabajos muy importantes en el método ProcessRequest() de la clase HttpRuntime, entre los cuales los más relacionados con los ingenieros de software Web son:
El método ProcessRequest() de la clase HttpRuntime crea un objeto HttpContext basado en la información de solicitud HTTP proporcionada en el objeto HttpWorkerRequest.
El objeto HttpContext es importante porque contiene otros dos objetos que son muy comunes en la programación ASP.NET: HttpResponse y HttpRequest.
La información del objeto HttpRequest proviene de la solicitud HTTP original. Por ejemplo, su atributo Url representa la URL en la información de la solicitud HTTP original.
El objeto HttpResponse tiene algunas propiedades y métodos para generar información que se devolverá al navegador.
La clase de página proporciona las propiedades correspondientes para hacer referencia a estos dos objetos, por lo que puede utilizar directamente las propiedades "Requset" y "Response" para acceder a estos dos objetos en la página web ASP.NET. Por ejemplo:
clase parcial pública _Default: System.Web.UI.Page
{
Page_Load vacío protegido (remitente del objeto, EventArgs e)
{
Respuesta .Escribir(Solicitud .Url);
}
}
La propiedad Context de la clase Page se refiere al objeto HttpContext, por lo que el código anterior también se puede reescribir de la siguiente forma:
clase parcial pública _Default: System.Web.UI.Page
{
Page_Load vacío protegido (remitente del objeto, EventArgs e)
{
this.Context.Response .Write(this.Context.Request .Url);
}
}
Respecto a los tres objetos HttpContext, HttpResponse y HttpRequest, debes dominar los siguientes puntos:
l El objeto HttpContext contiene dos objetos, HttpResponse y HttpRequest. Puede obtener información relacionada con la solicitud HTTP del objeto HttpRequest y el contenido que se enviará al navegador se puede lograr llamando al método HttpResponse.
l Para cada solicitud HTTP, ASP.NET crea un objeto HttpContext, al que se puede acceder durante todo el procesamiento HTTP.
5 Asigne un objeto HttpApplication para manejar la solicitud
Además de crear el objeto HttpContext, el método ProcessRequest() de la clase HttpRuntime también completa otro trabajo muy importante: solicitar la asignación de un objeto HttpApplication a una instancia de la clase HttpApplicationFactory [3] para gestionar cada paso en todo el procesamiento de la solicitud HTTP. tipo de evento.
El objeto HttpApplicationFactory es responsable de administrar un grupo de objetos HttpApplication [4]. Cuando llega una solicitud HTTP, si hay un objeto HttpApplication disponible en el grupo, este objeto se asigna directamente para procesar la solicitud HTTP. creado.
6 El objeto HttpApplication inicia la canalización HTTP
El objeto HttpApplication es responsable de ensamblar todo el "canal de procesamiento de solicitudes HTTP (HTTP Pipeline)". El "canal de procesamiento de solicitudes HTTP" se puede comparar con el "canal de producción" en una fábrica moderna. El objeto HttpContext creado en el paso anterior es el "producto" que será procesado por esta canalización de producción. Cuando fluye a través de diferentes partes de la "canalización de producción", se procesará y procesará específicamente.
¿Cómo se llevan a cabo estos “procesos y tratamientos” específicos?
En pocas palabras, cuando el objeto HttpContext pasa por diferentes partes del "canal de producción", el objeto HttpApplication desencadenará una serie de eventos [5]. Un componente específico: el módulo HTTP (módulo HTTP) puede responder a estos eventos. En este código de respuesta de evento, el objeto HttpContext se puede "procesar y procesar". En este sentido, el módulo HTTP puede considerarse como un "canal de producción". ”Trabajadores en. El módulo HTTP es en realidad el "filtro ISAPI" presentado anteriormente.
El objeto del módulo HTTP se crea en el método InitModules() [6] del objeto HttpApplication. Generalmente escribimos código en el método Init() [7] del objeto del módulo HTTP para que pueda responder a eventos específicos desencadenados por HttpApplication. objeto.
ASP.NET proporciona algunos módulos HTTP predefinidos para responder a eventos específicos, y los ingenieros de software web también pueden escribir sus propios módulos HTTP e insertarlos en el "canal de procesamiento de solicitudes HTTP" [8].
En medio de la canalización (después de procesar los eventos relacionados), el objeto de página final recibe el objeto HttpContext (esta es la razón por la que se puede acceder al objeto HttpContext en la página ASP.NET a través de la propiedad Context definida por la clase de página).
Cada página ASP.NET a la que se acceda se convertirá en una "clase de página derivada de la clase de página".
Nota: La clase Page implementa la interfaz IHttpHandler, que define un método ProcessRequest().
Una vez generada la clase de página ASP.NET, se compila automáticamente en un ensamblado y luego se llama automáticamente a su método ProcessRequest () (debido a que la clase Page implementa la interfaz IHttpHandler, debe tener este método). En este método, se ejecuta el código escrito por el ingeniero de software web (si lo hubiera). El resultado de la ejecución del método ProcessRequest() es nuevamente transportado por el objeto HttpContext, el control se transfiere nuevamente a la "canalización de procesamiento de solicitudes HTTP" y el objeto HttpApplication continúa activando eventos posteriores. En este momento, si hay módulos HTTP específicos que responden a estos eventos, se llamarán automáticamente.
El objeto HttpContext lleva el resultado del procesamiento final al final de la "canalización de procesamiento de solicitudes HTTP", y su información se extrae y se transmite al proceso de trabajo nuevamente usando aspnet_isapi.dll como puente. Luego, el proceso de trabajo transfiere los resultados del procesamiento de la solicitud HTTP a HTTP.SYS, que es responsable de devolver los resultados al navegador.
Según la introducción anterior, toda la canalización HTTP se puede dividir en tres secciones: etapa de preprocesamiento, etapa de procesamiento y etapa de posprocesamiento (Figura 8 ‑14).
Figura 8 ‑ 14 Tres etapas del proceso HTTP
Como se muestra en la Figura 8 ‑14, las etapas de preprocesamiento y posprocesamiento de la canalización HTTP cuentan principalmente con la participación de múltiples módulos HTTP y están impulsadas por eventos. El trabajo completado en estas dos etapas es principalmente para realizar varios atributos. del objeto HttpContext Revisar.
El procesamiento de solicitudes HTTP finalmente se completa en la "fase de procesamiento" mediante un objeto que implementa la interfaz IHttpHandler. Cada clase de página generada por páginas web ASP.NET implementa esta interfaz. El objeto PageHandlerFactory [9] es responsable de crear un objeto de procesamiento de solicitudes HTTP adecuado.
Se puede ver que el objeto que implementa la interfaz IHttpHandler es responsable de procesar las solicitudes HTTP, por lo que se llama "Handler (handler)".
Además de las páginas web ASP.NET más comunes, los ingenieros de software web también pueden crear sus propios objetos que implementan la interfaz IHttpHandler e insertarlos en la canalización HTTP para manejar solicitudes HTTP.
Cuando se procesa la solicitud HTTP, los objetos relacionados se liberan, pero el dominio de aplicación creado, HttpApplication y otros objetos aún sobreviven para responder a la siguiente solicitud HTTP.
7 Resumen del ciclo de vida de la aplicación ASP.NET
Esta sección presenta el ciclo de vida de las aplicaciones ASP.NET. Este es un proceso bastante complejo. Puede ser más fácil de entender con la siguiente analogía popular:
l "canal de procesamiento de solicitudes HTTP" es una "línea de ensamblaje de producción" en una fábrica moderna, y el objeto HttpContext es el producto que se procesará en esta línea de ensamblaje.
l El objeto HttpHandler (controlador HTTP) es el núcleo de toda la "línea de producción del producto", que es responsable de ensamblar el producto para darle forma.
l HttpModule (módulo HTTP) es equivalente a los trabajadores auxiliares en la "línea de producción". Realizan el "preprocesamiento" (preparación para el ensamblaje del producto) y el "postprocesamiento" (preparación para la entrega del producto, como el etiquetado) en. el producto (objeto HttpContext)).
l El objeto HttpApplication es el "líder" de toda la "línea de producción". Es responsable de asignar trabajadores a la "línea de producción" (inicializando y cargando todos los HttpModules registrados) y luego desencadenando una serie de eventos (llamados "ASP. NET" "), un HttpModule específico es responsable de responder a eventos específicos.
-------------------------------------------------- ----------------------------------
[1] Si el proceso de trabajo no existe, el programa de monitoreo de IIS WAS creará uno; de lo contrario, se reutilizará el proceso de trabajo existente.
[2] En el modo integrado de IIS 7, dado que CLR está precargado, este paso no es necesario.
[3] "Instancia de clase" y "objeto de clase" tienen el mismo significado y ambos se refieren a objetos creados utilizando clases como plantillas.
[4] El grupo de objetos (grupo de objetos) es un método de organización de objetos común en los sistemas de software orientados a objetos. Puede considerarse como un contenedor de objetos. El grupo de objetos contiene varios objetos creados de antemano. Cuando el mundo exterior necesita un objeto, puede sacar directamente un objeto ya preparado del grupo y usarlo, evitando así la pérdida de rendimiento causada por la creación frecuente de objetos.
[5] HttpApplication define bastantes eventos. Para obtener una lista completa de eventos, consulte MSDN.
[6] Este método se llamará automáticamente al obtener el objeto HttpApplication.
[7] Todos los módulos HTTP deben implementar la interfaz IHttpModule, y el método Init() está definido por esta interfaz.
[8] Se pueden agregar módulos HTTP personalizados al flujo de procesamiento de solicitudes HTTP insertando contenido específico en Web.Config.
[9] Este es otro núcleo del marco tecnológico ASP.NET.