Información general sobre el ciclo de vida de una aplicación ASP.NET para IIS 5.0 y 6.0
Actualización: noviembre 2007
En este tema se describe el ciclo de vida de las aplicaciones ASP.NET, se muestran los eventos importantes del mismo y se describe cómo puede incorporar el código que escribe en dicho ciclo de vida. La información de este tema se aplica a IIS 5.0 e IIS 6.0. Para obtener información sobre el ciclo de vida de la aplicación ASP.NET en IIS 7.0, vea Información general sobre el ciclo de vida de una aplicación ASP.NET para IIS 7.0.
En ASP.NET, deben producirse varios pasos de procesamiento para que una aplicación ASP.NET se inicialice y procese las solicitudes. Además, ASP.NET es sólo una parte de la arquitectura de servidor Web que atiende las solicitudes realizadas por los exploradores. Es importante que comprenda el ciclo de vida de la aplicación para que pueda escribir código en la fase apropiada del ciclo y conseguir el efecto deseado.
Ciclo de vida de la aplicación en general
En la tabla siguiente se describen las fases del ciclo de vida de la aplicación ASP.NET.
Fase |
Descripción |
---|---|
El usuario solicita un recurso de aplicación del servidor Web. |
El ciclo de vida de una aplicación ASP.NET se inicia con una solicitud enviada por un explorador al servidor Web (para las aplicaciones ASP.NET, normalmente es IIS). ASP.NET es una extensión ISAPI bajo el servidor Web. Cuando un servidor web recibe una solicitud, examina la extensión de nombre de archivo del archivo solicitado, determina la extensión ISAPI que debería procesar dicha solicitud y, a continuación, pasa ésta a la extensión ISAPI apropiada. ASP.NET procesa las extensiones de nombre de archivo que tiene asignadas, como .aspx, .ascx, .ashx y .asmx.
Nota:
Si una extensión de nombre de archivo no se ha asignado a ASP.NET, éste no recibirá la solicitud. Es importante entender esto en las aplicaciones que utilizan la autenticación de ASP.NET. Por ejemplo, dado que los archivos .htm normalmente no se asignan a ASP.NET, esta aplicación no realizará la autenticación ni las comprobaciones de autorización en las solicitudes de archivos .htm. Por consiguiente, aunque un archivo incluya únicamente contenido estático, si desea que ASP.NET compruebe la autenticación, cree el archivo utilizando una extensión de nombre de archivo asignada a ASP.NET, por ejemplo .aspx.
Nota:
Si opta por crear un controlador personalizado para procesar una extensión de nombre de archivo determinada, deberá asignar la extensión a ASP.NET en IIS, así como también registrar el controlador en el archivo Web.config de la aplicación. Para obtener más información, vea Información general sobre controladores HTTP y módulos HTTP.
|
ASP.NET recibe la primera solicitud para la aplicación. |
Cuando ASP.NET recibe la primera solicitud para cualquier recurso de una aplicación, una clase denominada ApplicationManager crea un dominio de aplicación. Los dominios de aplicación proporcionan aislamiento entre aplicaciones para las variables globales y permiten descargar cada aplicación de forma independiente. Dentro de un dominio de aplicación, se crea una instancia de la clase denominada HostingEnvironment, que proporciona acceso a la información sobre la aplicación, como el nombre de la carpeta en la que está almacenada la aplicación. En el diagrama siguiente se muestra esta relación: ASP.NET también compila los elementos de nivel superior de la aplicación si es necesario, incluido el código de aplicación de la carpeta App_Code. Para obtener más información, vea después "Ciclo de vida de la compilación", más adelante en este tema. |
Se crean los objetos de núcleo ASP.NET para cada solicitud. |
Una vez creados el dominio de aplicación y una instancia del objeto HostingEnvironment, ASP.NET crea e inicializa objetos de núcleo, como HttpContext, HttpRequest y HttpResponse. La clase HttpContext contiene objetos específicos de la solicitud de aplicación actual, como los objetos HttpRequest y HttpResponse. El objeto HttpRequest contiene datos sobre la solicitud actual, entre los que se incluyen las cookies e información del explorador. El objeto HttpResponse contiene la respuesta que se envía al cliente, la cual incluye todos los resultados representados y las cookies. |
Se asigna un objeto HttpApplication a la solicitud. |
Una vez que se han inicializado todos los objetos principales de la aplicación, ésta se inicia creando una instancia de la clase HttpApplication. Si la aplicación tiene un archivo Global.asax, ASP.NET crea una instancia de la clase Global.asax derivada de la clase HttpApplication y la utiliza para representar la aplicación.
Nota:
La primera vez que se solicita una página o un proceso ASP.NET en una aplicación, se crea una nueva instancia de HttpApplication. Sin embargo, para maximizar el rendimiento, las instancias de HttpApplication se podrían reutilizar para múltiples solicitudes.
Cuando se crea una instancia de HttpApplication, también se crean los módulos configurados. Por ejemplo, si la aplicación está configurada para ello, ASP.NET crea un módulo SessionStateModule. Una vez creados todos los módulos configurados, se llama al método Init de la clase HttpApplication. En el diagrama siguiente se muestra esta relación: |
La canalización de HttpApplication procesa la solicitud. |
La clase HttpApplication ejecuta los eventos siguientes mientras se procesa la solicitud. Dichos eventos son de particular interés para los desarrolladores que desean extender la clase HttpApplication.
|
Los eventos del ciclo de vida y el archivo Global.asax
Durante el ciclo de vida de la aplicación, ésta produce eventos que se pueden controlar y llama a determinados métodos que se pueden reemplazar. Para controlar estos eventos y métodos, puede crear un archivo denominado Global.asax en el directorio raíz de la aplicación.
Si crea un archivo Global.asax, ASP.NET lo compila en una clase derivada de la clase HttpApplication y, continuación, utiliza la clase derivada para representar la aplicación.
Una instancia de HttpApplication no puede procesar varias solicitudes simultáneamente. Esto simplifica el control de los eventos de la aplicación, dado que no es necesario bloquear los miembros no estáticos de la clase de aplicación al tener acceso a ellos. Asimismo, esto permite almacenar datos específicos de la solicitud en miembros no estáticos de la clase de aplicación. Por ejemplo, puede definir una propiedad en el archivo Global.asax y asignarla un valor específico de la solicitud.
ASP.NET enlaza automáticamente los eventos de aplicación a los controladores en el archivo Global.asax mediante la convención de nomenclatura Application_evento; por ejemplo, Application_BeginRequest. Esto es similar a la manera en que los métodos de página ASP.NET se enlazan automáticamente a eventos, como el evento de página Page_Load. Para obtener información detallada, vea Información general sobre el ciclo de vida de una página ASP.NET.
Los métodos Application_Start y Application_End son métodos especiales que no representan eventos HttpApplication. ASP.NET los llama sólo una vez durante el período de duración del dominio de aplicación, no para cada instancia de HttpApplication.
En la tabla siguiente se muestran algunos de los eventos y métodos que se utilizan durante el ciclo de vida de la aplicación. Hay muchos más eventos que los mostrados, pero normalmente no se utilizan.
Evento o método |
Descripción |
---|---|
Application_Start |
Se le llama cuando se solicita el primer recurso (por ejemplo, una página) en una aplicación ASP.NET. Sólo se llama una vez al método Application_Start durante el ciclo de vida de una aplicación. Puede utilizar este método para realizar las tareas de inicio, como cargar datos en la caché e inicializar los valores estáticos. Durante el inicio de la aplicación, sólo debería establecer datos estáticos. No establezca datos de instancia, dado que sólo estarán disponibles para la primera instancia de la clase HttpApplication que se cree. |
Application_event |
Se produce en el momento adecuado del ciclo de vida de la aplicación, tal y como se muestra en la tabla de ciclo de vida de la aplicación incluida al principio de este tema. Application_Error se puede provocar en cualquier fase del ciclo de vida de la aplicación. Application_EndRequest es el único evento cuya ejecución se garantiza en cada solicitud, dado que ésta se puede cortocircuitar. Por ejemplo, si dos módulos controlan el evento Application_BeginRequest y el primero produce una excepción, no se llamará al evento Application_BeginRequest para el segundo módulo. Sin embargo, siempre se llama al método Application_EndRequest para que la aplicación pueda limpiar los recursos. |
Se le llama una vez para cada instancia de la clase HttpApplication una vez que se han creado todos los módulos. |
|
Se le llama antes de que se destruya la instancia de aplicación. Puede utilizar este método para liberar manualmente cualquier recurso no administrado. Para obtener más información, vea Limpiar recursos no administrados. |
|
Application_End |
Se le llama una vez durante el período de duración de la aplicación antes de que ésta se descargue. |
Ciclo de vida de la compilación
Cuando se realiza la primera solicitud a una aplicación, ASP.NET compila los elementos de la aplicación en un orden específico. Los primeros elementos que se van a compilar se denominan elementos de nivel superior. Después de la primera solicitud, se vuelven a compilar los elementos de nivel superior sólo si cambia una dependencia. En la tabla siguiente se describe el orden en que se compilan los elementos de nivel superior de ASP.NET.
Elemento |
Descripción |
---|---|
App_GlobalResources |
Se compilan los recursos globales de la aplicación y se genera un ensamblado de recursos. Los ensamblados ubicados en la carpeta Bin de la aplicación están vinculados al ensamblado de recursos. |
App_WebResources |
Se crean y se compilan los tipos de servidor proxy para los servicios Web. El ensamblado de referencias Web resultante está vinculado al ensamblado de recursos, si existe. |
Propiedades de perfil definidas en el archivo Web.config |
Si hay propiedades de perfil definidas en el archivo Web.config de la aplicación, se genera un ensamblado que contenga un objeto de perfil. |
App_Code |
Se generan los archivos de código fuente y se crea uno o varios ensamblados. Todos los ensamblados de código y el ensamblado de perfiles están vinculados a los ensamblados de recursos y referencias Web, si existen. |
Global.asax |
Se compila el objeto de aplicación y se vincula a todos los ensamblados previamente generados. |
Después de compilar los elementos de nivel superior de la aplicación, ASP.NET compila las carpetas, páginas y otros elementos según sea necesario. En la tabla siguiente se describe el orden en que se compilan las carpetas y los elementos de ASP.NET.
Elemento |
Descripción |
---|---|
App_LocalResources |
Si la carpeta que contiene el elemento solicitado incluye una carpeta App_LocalResources, se compila el contenido de la carpeta de recursos locales y se vincula al ensamblado de recursos globales. |
Páginas Web individuales (archivos .aspx), controles de usuario (archivos .ascx), controladores HTTP (archivos .ashx) y módulos HTTP (archivos .asmx) |
Se compilan según sea necesario y se vinculan al ensamblado de recursos locales y a los ensamblados de nivel superior. |
Temas, páginas principales, otros archivos de código fuente |
Los archivos de máscara para temas individuales, páginas principales y otros archivos de código fuente a los que hacen referencia las páginas se compilan una vez compilada la página que hace referencia. |
Los ensamblados compilados se almacenan en la memoria caché del servidor, se vuelven a utilizar en solicitudes subsiguientes y se conservan al reiniciarse la aplicación siempre y cuando permanezca sin modificar el código fuente.
Dado que la aplicación se compila con la primera solicitud, la solicitud inicial a una aplicación puede tardar bastante más que las solicitudes subsiguientes. Puede precompilar la aplicación para reducir el tiempo requerido para la primera solicitud. Para obtener más información, vea Cómo: Precompilar sitios Web ASP.NET.
Reinicios de aplicación
Si se modifica el código fuente de una aplicación Web, ASP.NET volverá a compilar los archivos de código fuente en ensamblados. Si se modifican los elementos de nivel superior de la aplicación, también se volverán a compilar todos los demás ensamblados de la aplicación que hagan referencia a los ensamblados de nivel superior.
Además, si se modifican, agregan o eliminan determinados tipos de archivo de las carpetas conocidas de la aplicación, ésta se reiniciará. Las siguientes acciones causarán el reinicio de una aplicación:
Agregar, modificar o eliminar ensamblados de la carpeta Bin de la aplicación.
Agregar, modificar o eliminar recursos de localización de las carpetas App_GlobalResources y App_LocalResources.
Agregar, modificar o eliminar el archivo Global.asax de la aplicación.
Agregar, modificar o eliminar archivos de código fuente del directorio App_Code.
Agregar, modificar o eliminar la configuración de perfiles.
Agregar, modificar o eliminar referencias de servicio Web del directorio App_WebReferences.
Agregar, modificar o eliminar el archivo Web.config de la aplicación.
Cuando se requiera el reinicio de una aplicación, ASP.NET atenderá todas las solicitudes pendientes del actual dominio de aplicación y de los antiguos ensamblados antes de reiniciar el dominio de aplicación y cargar los nuevos ensamblados.
Módulos HTTP
El ciclo de vida de la aplicación ASP.NET es ampliable a través de las clases IHttpModule. ASP.NET incluye varias clases que implementan IHttpModule, como la clase SessionStateModule. Si lo desea, también puede crear sus propias clases que implementen IHttpModule.
Si agrega módulos a su aplicación, dichos módulos pueden producir eventos. La aplicación se puede suscribir a estos eventos en el archivo Global.asax mediante la convención nombreMódulo_nombreEvento. Por ejemplo, para controlar el evento Authenticate provocado por un objeto FormsAuthenticationModule, puede crear un controlador denominado FormsAuthentication_Authenticate.
La clase SessionStateModule está habilitada de forma predeterminada en ASP.NET. Todos los eventos de sesión se conectan automáticamente como Session_evento, como por ejemplo Session_Start. El evento Start se provoca cada vez que se crea una nueva sesión. Para obtener más información, vea Información general sobre el estado de sesión de ASP.NET.
Vea también
Conceptos
Información general sobre el ciclo de vida de una página ASP.NET
Información general sobre ASP.NET
Información general sobre la compilación de ASP.NET