Condividi tramite


Cenni preliminari sul ciclo di vita delle applicazioni ASP.NET per IIS 5.0 e 6.0

Aggiornamento: novembre 2007

In questo argomento viene illustrato il ciclo di vita delle applicazioni ASP.NET e ne vengono elencati gli eventi importanti; viene inoltre descritto come inserire il codice scritto nel ciclo di vita dell'applicazione. Le informazioni contenute in questo argomento sono applicabili a IIS 5.0 e IIS 6.0. Per informazioni sul ciclo di vita delle applicazioni ASP.NET in IIS 7.0, vedere Cenni preliminari sul ciclo di vita delle applicazioni ASP.NET per IIS 7.0.

In ASP.NET sono necessarie diverse procedure di elaborazione perché un'applicazione venga inizializzata e processi le richieste. Inoltre, ASP.NET è l'unico componente dell'architettura server Web in grado di gestire le richieste del browser. È importante capire il ciclo di vita dell'applicazione per arrivare a inserire il codice nella fase appropriata del ciclo di vita e ottenere così l'effetto desiderato.

Informazioni di base sul ciclo di vita dell'applicazione

Nella tabella seguente vengono illustrate le fasi del ciclo di vita di un'applicazione ASP.NET.

Fase

Descrizione

L'utente richiede al server Web una risorsa dell'applicazione.

Il ciclo di vita di un'applicazione ASP.NET inizia con una richiesta inviata da un browser al server Web. In genere, per applicazioni ASP.NET si utilizza IIS. Nel server Web, ASP.NET è un'estensione ISAPI. Quando un server Web riceve una richiesta, verifica l'estensione del file richiesto, determina quale estensione ISAPI deve gestire la richiesta, quindi passa quest'ultima all'estensione ISAPI appropriata. ASP.NET gestisce le estensioni dei nomi file file mappate: ad esempio, aspx, ascx, ashx e asmx.

Nota:
Se un'estensione di file non è stata mappata ad ASP.NET, questo non riceverà la richiesta. Questa considerazione è fondamentale per le applicazioni che utilizzano l'autenticazione ASP.NET. Ad esempio, poiché i file htm in genere non sono mappati ad ASP.NET, ASP.NET non eseguirà l'autenticazione né verifiche di autorizzazione su richieste di file htm. Pertanto, anche se un file ha solo contenuto statico, se si desidera che ASP.NET verifichi l'autenticazione, è necessario che tale file venga creato utilizzando un'estensione mappata a ASP.NET, come, ad esempio, aspx.
Nota:
Se si crea un gestore personalizzato per una determinata estensione di nome di file, è necessario mappare l'estensione a ASP.NET in IIS e registrare inoltre il gestore nel file Web.config dell'applicazione. Per ulteriori informazioni, vedere la classe Cenni preliminari su gestori HTTP e moduli HTTP.

ASP.NET riceve la prima richiesta per l'applicazione.

Quando ASP.NET riceve la prima richiesta per una risorsa qualsiasi in un'applicazione, una classe denominata ApplicationManager crea un dominio applicazione. I domini applicazione forniscono l'isolamento tra applicazioni per le variabili globali e consentono di scaricare separatamente ciascuna applicazione. In un dominio applicazione, viene creata un'istanza della classe denominata HostingEnvironment, che consente di accedere alle informazioni dell'applicazione come, ad esempio. il nome della cartella in cui questa è archiviata.

Questa relazione viene illustrata nel diagramma seguente:

Se necessario, ASP.NET compila anche gli elementi di primo livello nell'applicazione, incluso il codice dell'applicazione nella cartella App_Code. Per ulteriori informazioni, vedere "Ciclo di vita della compilazione" più avanti in questo argomento.

Gli oggetti principali ASP.NET vengono creati per ogni richiesta.

Dopo aver creato il dominio applicazione e istanziato l'oggetto HostingEnvironment, ASP.NET crea e inizializza gli oggetti principali, come HttpContext, HttpRequest e HttpResponse. La classe HttpContext contiene oggetti specifici per la richiesta corrente dell'applicazione, come gli oggetti HttpRequest e HttpResponse. L'oggetto HttpRequest contiene informazioni relative alla richiesta corrente, inclusi cookie e informazioni sul browser. L'oggetto HttpResponse contiene la risposta inviata al client, inclusi tutti gli output dopo rendering e i cookie.

Un oggetto HttpApplication viene assegnato alla richiesta.

Dopo l'inizializzazione di tutti i principali oggetti dell'applicazione, questa viene avviata mediante la creazione di un'istanza della classe HttpApplication. Se nell'applicazione è già presente il file Global.asax, ASP.NET creerà invece un'istanza della classe Global.asax; questa istanza, derivata dalla classe HttpApplication, verrà utilizzata per rappresentare l'applicazione.

Nota:
Al momento della prima richiesta di una pagina o di un processo ASP.NET in un'applicazione, viene creata una nuova istanza di HttpApplication. Tuttavia, per ottimizzare le prestazioni, si consiglia di riutilizzare le istanze HttpApplication per più richieste.

Con la creazione di un'istanza di HttpApplication vengono creati anche tutti i moduli configurati. Ad esempio, se la configurazione dell'applicazione lo consente, ASP.NET crea un modulo SessionStateModule. In seguito alla creazione di tutti i moduli configurati, viene chiamato il metodo Init della classe HttpApplication.

Questa relazione viene illustrata nel diagramma seguente:

La richiesta viene elaborata dalla pipeline HttpApplication.

Durante l'elaborazione della richiesta, la classe HttpApplication esegue gli eventi riportati di seguito, particolarmente utili per gli sviluppatori che desiderano estendere la classe HttpApplication.

  1. Convalidare la richiesta, che analizza l'informazione inviata dal browser e determina se contiene markup potenzialmente dannoso. Per ulteriori informazioni, vedere ValidateRequest e Cenni preliminari sugli attacchi tramite script.

  2. Eseguire la mappatura degli URL se tutti gli URL sono stati configurati nella sezione UrlMappingsSection del file Web.config.

  3. Generare l'evento BeginRequest.

  4. Generare l'evento AuthenticateRequest.

  5. Generare l'evento PostAuthenticateRequest.

  6. Generare l'evento AuthorizeRequest.

  7. Generare l'evento PostAuthorizeRequest.

  8. Generare l'evento ResolveRequestCache.

  9. Generare l'evento PostResolveRequestCache.

  10. In base all'estensione del nome del file della risorsa richiesta, mappata nel file di configurazione dell'applicazione, selezionare una classe che implementa IHttpHandler per processare la richiesta. Se la richiesta è relativa a un oggetto o una pagina derivanti dalla classe Page e la pagina deve essere compilata, ASP.NET la compilerà prima di crearne un'istanza.

  11. Generare l'evento PostMapRequestHandler.

  12. Generare l'evento AcquireRequestState.

  13. Generare l'evento PostAcquireRequestState.

  14. Generare l'evento PreRequestHandlerExecute.

  15. Chiamare il metodo ProcessRequest (o la versione asincrona IHttpAsyncHandler.BeginProcessRequest) della classe IHttpHandler appropriata per la richiesta. Ad esempio, una richiesta relativa a una pagina verrà gestita dall'istanza della pagina in uso.

  16. Generare l'evento PostRequestHandlerExecute.

  17. Generare l'evento ReleaseRequestState.

  18. Generare l'evento PostReleaseRequestState.

  19. Eseguire le operazioni di filtro, se la proprietà Filter è definita.

  20. Generare l'evento UpdateRequestCache.

  21. Generare l'evento PostUpdateRequestCache.

  22. Generare l'evento EndRequest.

  23. Generare l'evento PreSendRequestHeaders.

  24. Generare l'evento PreSendRequestContent.

Eventi del ciclo di vita e file Global.asax

Durante il proprio ciclo di vita, l'applicazione genera eventi che possono essere gestiti e chiama metodi particolari di cui è possibile eseguire l'override. Per gestire eventi o metodi dell'applicazione, è possibile creare un file denominato Global.asax nella directory principale dell'applicazione.

Se viene creato un file Global.asax, ASP.NET lo compila in una classe derivata dalla classe HttpApplication, quindi utilizza la classe derivata per rappresentare l'applicazione.

Un'istanza di HttpApplication elabora solo una richiesta per volta Ciò rende più semplice la gestione degli eventi dell'applicazione, in quanto elimina la necessità di bloccare i membri non statici nella classe dell'applicazione durante l'accesso; consente inoltre di archiviare i dati specifici della richiesta in membri non statici della classe dell'applicazione. Ad esempio, è possibile definire una proprietà nel file Global.asax e assegnarle un valore specifico per la richiesta.

ASP.NET associa automaticamente gli eventi dell'applicazione ai gestori nel file Global.asax, utilizzando la convenzione di denominazione Application_evento, ad esempio Application_BeginRequest. In modo analogo, i metodi delle pagine ASP.NET vengono automaticamente associati a eventi, come, ad esempio, l'evento Page_Load della pagina. Per informazioni, vedere Cenni preliminari sul ciclo di vita di una pagina ASP.NET.

I metodi Application_Start e Application_End sono metodi speciali che non rappresentano eventi HttpApplication. Questi elementi vengono chiamati da ASP.NET una sola volta per tutta la durata di vita del dominio applicazione, e non per ogni istanza di HttpApplication.

Nella tabella seguente sono elencati alcuni eventi e i metodi utilizzati durante il ciclo di vita dell'applicazione. Gli eventi sono molto più numerosi rispetto a quelli qui elencati, ma non sono di uso comune.

Evento o metodo

Descrizione

Application_Start

Chiamato al momento della richiesta della prima risorsa, come, ad esempio, una pagina, in un'applicazione ASP.NET. Il metodo Application_Start viene chiamato una volta sola per tutta la durata dell'applicazione. Questo metodo può essere utilizzato per eseguire attività di avvio, come, ad esempio, il caricamento di dati nella cache e l'inizializzazione di valori statici.

Durante l'avvio dell'applicazione, si consiglia di impostare solo dati statici e non dati di istanza, perché questi saranno disponibili solo per la prima istanza della classe HttpApplication creata.

Application_event

Generato al momento opportuno nel ciclo di vita dell'applicazione, come precedentemente riportato in questa sezione nella tabella del ciclo di vita dell'applicazione.

Application_Error può essere generato in qualsiasi fase del ciclo di vita dell'applicazione.

Application_EndRequest è l'unico evento che verrà sicuramente generato in ogni richiesta, perché una richiesta può essere utilizzata come operatore di corto circuito. Ad esempio, se due moduli gestiscono l'evento Application_BeginRequest e il primo genera un'eccezione, l'evento Application_BeginRequest non sarà chiamato per il secondo modulo. Tuttavia, il metodo Application_EndRequest viene sempre chiamato per permettere all'applicazione di liberare risorse.

Init

Chiamato una sola volta per ogni istanza della classe HttpApplication dopo che tutti i moduli sono stati creati.

Dispose

Chiamato prima dell'eliminazione permanente dell'istanza dell'applicazione. È possibile utilizzare questo metodo per liberare manualmente risorse non gestite. Per ulteriori informazioni, vedere Pulitura delle risorse non gestite.

Application_End

Chiamato una volta per durata dell'applicazione prima che questa venga scaricata.

Ciclo di vita della compilazione

Quando viene effettuata la prima richiesta a un'applicazione, ASP.NET compila gli elementi dell'applicazione secondo un ordine specifico. I primi elementi da compilare vengono detti elementi di livello principale. Dopo la prima richiesta gli elementi di livello principale vengono ricompilati solo se cambia una dipendenza. Nella seguente tabella viene descritto l'ordine di compilazione degli elementi di livello principale.

Elemento

Descrizione

App_GlobalResources

Vengono compilate le risorse globali dell'applicazione e viene generato un assembly di risorse. Tutti gli assembly nella cartella Bin dell'applicazione vengono collegati all'assembly di risorse.

App_WebResources

Vengono creati e compilati i tipi proxy per i servizi Web. Il risultante assembly di riferimenti Web viene collegato all'assembly di risorse, se esistente.

Proprietà del profilo definite nel file Web.config

Se nel file Web.config dell'applicazione sono definite proprietà del profilo, viene generato un assembly che contiene un oggetto profilo.

App_Code

Vengono compilati i file del codice sorgente e vengono creati uno o più assembly. Tutti gli assembly di codice e l'assembly del profilo vengono collegati alle risorse e agli assembly dei riferimenti Web, se esistenti.

Global.asax

Viene compilato l'oggetto applicazione, che viene collegato a tutti gli assembly generati in precedenza.

Dopo aver compilato gli elementi di livello superiore dell'applicazione, ASP.NET compila le cartelle, le pagine e altri elementi secondo necessità. Nella seguente tabella viene descritto l'ordine di compilazione delle cartelle e degli elementi ASP.NET

Elemento

Descrizione

App_LocalResources

Se la cartella contenente l'elemento richiesto contiene una cartella App_LocalResources, il contenuto della cartella delle risorse locali viene compilato e collegato all'assembly delle risorse globali.

Singole pagine Web (file aspx), controlli utente (file ascx), gestori HTTP (file ashx) e moduli HTTP (file asmx)

Vengono compilati come necessario e collegati all'assembly delle risorse locali e agli assembly di livello principale.

Temi, pagine master, altri file di origine

I file di interfaccia per singoli temi, le pagine master e gli altri file di codice sorgente a cui viene fatto riferimento dalle pagine vengono compilati quando viene compilata la pagina di riferimento.

Gli assembly compilati vengono memorizzati nella cache nel server e riutilizzati per le richieste successive e vengono conservati anche dopo i riavvii, purché il codice sorgente non cambi.

Dal momento che l'applicazione viene compilata alla prima richiesta, la richiesta iniziale di un'applicazione può richiedere molto più tempo delle richieste successive. È possibile precompilare l'applicazione per ridurre il tempo necessario per la prima richiesta. Per ulteriori informazioni, vedere Procedura: precompilare siti Web ASP.NET.

Riavvii dell'applicazione

La modifica del codice sorgente dell'applicazione Web causa la ricompilazione dei file di origine in assembly. Quando si modificano gli elementi di livello principale dell'applicazione, vengono ricompilati anche tutti gli altri assembly dell'applicazione che fanno riferimento agli assembly di livello principale.

Inoltre, la modifica, l'aggiunta o l'eliminazione di alcuni tipi di file nelle cartelle note dell'applicazione comporta il riavvio dell'applicazione. Di seguito sono riportate le azioni che comportano il riavvio dell'applicazione:

  • Aggiunta, modifica o eliminazione di assembly dalla cartella Bin dell'applicazione.

  • Aggiunta, modifica o eliminazione di risorse di localizzazione dalle cartelle App_GlobalResources o App_LocalResources.

  • Aggiunta, modifica o eliminazione del file Global.asax dell'applicazione.

  • Aggiunta, modifica o eliminazione dei file del codice sorgente nella directory App_Code.

  • Aggiunta, modifica o eliminazione della configurazione del profilo.

  • Aggiunta, modifica o eliminazione dei riferimenti ai servizi Web nella directory App_WebReferences.

  • Aggiunta, modifica o eliminazione del file Web.config dell'applicazione.

Quando è necessario riavviare un'applicazione, ASP.NET soddisfa tutte le richieste in corso provenienti dal dominio applicazione esistente e dai vecchi assembly prima di riavviare il dominio applicazione e caricare i nuovi assembly.

Moduli HTTP

È possibile creare un'estensione del ciclo di vita dell'applicazione ASP.NET tramite le classi IHttpModule. ASP.NET include diverse classi che implementano IHttpModule, come, ad esempio, la classe SessionStateModule. È anche possibile creare classi personalizzate che implementano IHttpModule.

Se si aggiungono moduli all'applicazione, i moduli stessi possono generare eventi. L'applicazione può effettuare la sottoscrizione a tali eventi nel file Global.asax mediante la convenzione nomemodulo_nomeevento. Ad esempio, per gestire l'evento Authenticate generato da un oggetto FormsAuthenticationModule è possibile creare un gestore denominato FormsAuthentication_Authenticate.

Per impostazione predefinita, in ASP.NET la classe SessionStateModule è attivata. Tutti gli eventi della sessione vengono automaticamente raggruppati come Session_evento, ad esempio Session_Start. L'evento Start viene generato ogni volta che viene creata una nuova sessione. Per ulteriori informazioni, vedere Cenni preliminare sullo stato della sessione ASP.NET.

Vedere anche

Concetti

Cenni preliminari sul ciclo di vita di una pagina ASP.NET

Cenni preliminari su ASP.NET

Cenni preliminari sulla compilazione in ASP.NET

Altre risorse

Configurazione di ASP.NET e IIS