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.

  1. Valida la solicitud, que examina la información enviada por el explorador y determina si contiene formato potencialmente malintencionado. Para obtener más información, vea ValidateRequest e Información general sobre los ataques mediante secuencias de comandos.

  2. Realiza la asignación de direcciones URL si se ha configurado alguna dirección URL en la sección UrlMappingsSection del archivo Web.config.

  3. Produce el evento BeginRequest.

  4. Produce el evento AuthenticateRequest.

  5. Produce el evento PostAuthenticateRequest.

  6. Produce el evento AuthorizeRequest.

  7. Produce el evento PostAuthorizeRequest.

  8. Produce el evento ResolveRequestCache.

  9. Produce el evento PostResolveRequestCache.

  10. Basándose en la extensión de nombre de archivo del recurso solicitado (asignada en el archivo de configuración de la aplicación), selecciona una clase que implemente IHttpHandler para procesar la solicitud. Si la solicitud es para un objeto (página) derivado de la clase Page y es necesario compilar la página, ASP.NET la compila antes de crear una instancia de ella.

  11. Produce el evento PostMapRequestHandler.

  12. Produce el evento AcquireRequestState.

  13. Produce el evento PostAcquireRequestState.

  14. Produce el evento PreRequestHandlerExecute.

  15. Llama al método ProcessRequest (o a la versión asincrónica IHttpAsyncHandler.BeginProcessRequest) de la clase IHttpHandler apropiada para la solicitud. Por ejemplo, si la solicitud es para una página, la controla la instancia de la página actual.

  16. Produce el evento PostRequestHandlerExecute.

  17. Produce el evento ReleaseRequestState.

  18. Produce el evento PostReleaseRequestState.

  19. Realiza el filtrado de respuestas si se define la propiedad Filter.

  20. Produce el evento UpdateRequestCache.

  21. Produce el evento PostUpdateRequestCache.

  22. Produce el evento EndRequest.

  23. Produce el evento PreSendRequestHeaders.

  24. Produce el evento PreSendRequestContent.

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.

Init

Se le llama una vez para cada instancia de la clase HttpApplication una vez que se han creado todos los módulos.

Dispose

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

Otros recursos

Configuración de ASP.NET e IIS