INFO: Istanze, eventi e stato dell'applicazione in ASP.NET

Questo articolo è stato precedentemente pubblicato con il codice di riferimento I312607
Dichiarazione di non responsabilità per articoli della Microsoft Knowledge Base su prodotti non più supportati
Questo articolo è stato scritto sui prodotti per cui Microsoft non offre più supporto. L’articolo, quindi, viene offerto ‘così come è’ e non verrà più aggiornato.
Sommario
L'oggettoHttpApplicationdi ASP.NET rende trasparenti molti concetti complessi per semplificare il modello di programmazione. In questo articolo vengono descritte alcune di queste complessità e viene inoltre illustrato come sono gestiti i problemi di compatibilità tra ASP.NET e il classico oggettoApplicationdi Microsoft Active Server Pages (ASP).

Questo articolo è suddiviso nelle seguenti sezioni:
Informazioni

Classe di applicazione e istanze dell'applicazione

Una classe di applicazione è definita nel file Global.asax. Il codice contenuto in Global.asax definisce una nuova classe derivata daSystem.Web.HttpApplication. Se non è presente un file Global.asax, viene utilizzata la classe base,HttpApplication, come classe di applicazione.

Nell'ambiente runtime di ASP.NET vengono create tutte le istanze delle classi di applicazioni necessarie per elaborare contemporaneamente le richieste. Per quasi tutte le applicazioni questo numero è limitato dal numero di thread ed è compreso nell'intervallo tra 1 e 100, a seconda dell'hardware, del carico del server, della configurazione e così via. Molte richieste riutilizzano istanze dell'applicazione di cui viene mantenuto un elenco durante il periodo di carico ridotto. Le istanze dell'applicazione vengono utilizzate in modo thread-safe, ovvero una richiesta alla volta, e questo presenta importanti implicazioni:
  • Non è necessario preoccuparsi del blocco quando si accede a membri non statici della classe di applicazione.
  • Nel codice dell'applicazione possono essere conservati i dati per ogni richiesta nei membri non statici della classe di applicazione (ma non dopo l'eventoEndRequestche può mantenere la richiesta a lungo).
Poiché i membri statici di qualsiasi classe, inclusa la classe di applicazione, non sono thread-safe, il codice dell'utente deve fornire capacità di blocco adeguate per l'accesso ai membri statici. Questo concetto è applicabile a qualsiasi membro statico aggiunto alla classe di applicazione.

Utilizzare le seguenti indicazioni per accedere all'istanza dell'applicazione associata alla richiesta corrente:
  • Dal file Global.asax; utilizzare l'oggettothisoMe.
  • Da una pagina; ogni pagina include una proprietàApplicationInstancetipizzata in modo sicuro.
  • Dall'oggettoHttpContext; utilizzare la proprietàHttpContext.ApplicationInstance(che viene immessa comeHttpApplication).
NOTA: poichéApplicationsi riferisce al dizionario dello stato di applicazione globale nell'ambiente ASP classico, ASP.NET utilizzaApplicationInstancee nonApplicationcome nome di proprietà per fare riferimento all'istanza dell'applicazione che elabora la richiesta corrente.

Eventi dell'applicazione

La durata di una richiesta è formata da una serie di eventi dell'applicazione (e alcuni passaggi impliciti implementati da ASP.NET). Questi eventi sono elencati di seguito nell'ordine in cui sono eseguiti:
  1. BeginRequest, eventoAuthenticateRequest, eventoDefaultAuthentication, evento internoAuthorizeRequest, eventoResolveRequestCache, eventoPassaggio interno per il "gestore mappe" (durante la compilazione viene creata l'istanza di una pagina)AcquireRequestState, eventoPreRequestHandlerExecute, eventoPassaggio interno per il "gestore esecuzione" (quando viene eseguito il codice della pagina)PostRequestHandlerExecute, eventoReleaseRequestState, eventoPassaggio interno per filtrare le risposteUpdateRequestCache, eventoEndRequest, evento
  2. AuthenticateRequest, eventoDefaultAuthentication, evento internoAuthorizeRequest, eventoResolveRequestCache, eventoPassaggio interno per il "gestore mappe" (durante la compilazione viene creata l'istanza di una pagina)AcquireRequestState, eventoPreRequestHandlerExecute, eventoPassaggio interno per il "gestore esecuzione" (quando viene eseguito il codice della pagina)PostRequestHandlerExecute, eventoReleaseRequestState, eventoPassaggio interno per filtrare le risposteUpdateRequestCache, eventoEndRequest, evento
  3. DefaultAuthentication, evento internoAuthorizeRequest, eventoResolveRequestCache, eventoPassaggio interno per il "gestore mappe" (durante la compilazione viene creata l'istanza di una pagina)AcquireRequestState, eventoPreRequestHandlerExecute, eventoPassaggio interno per il "gestore esecuzione" (quando viene eseguito il codice della pagina)PostRequestHandlerExecute, eventoReleaseRequestState, eventoPassaggio interno per filtrare le risposteUpdateRequestCache, eventoEndRequest, evento
  4. AuthorizeRequest, eventoResolveRequestCache, eventoPassaggio interno per il "gestore mappe" (durante la compilazione viene creata l'istanza di una pagina)AcquireRequestState, eventoPreRequestHandlerExecute, eventoPassaggio interno per il "gestore esecuzione" (quando viene eseguito il codice della pagina)PostRequestHandlerExecute, eventoReleaseRequestState, eventoPassaggio interno per filtrare le risposteUpdateRequestCache, eventoEndRequest, evento
  5. ResolveRequestCache, eventoPassaggio interno per il "gestore mappe" (durante la compilazione viene creata l'istanza di una pagina)AcquireRequestState, eventoPreRequestHandlerExecute, eventoPassaggio interno per il "gestore esecuzione" (quando viene eseguito il codice della pagina)PostRequestHandlerExecute, eventoReleaseRequestState, eventoPassaggio interno per filtrare le risposteUpdateRequestCache, eventoEndRequest, evento
  6. Passaggio interno per il "gestore mappe" (durante la compilazione viene creata l'istanza di una pagina)AcquireRequestState, eventoPreRequestHandlerExecute, eventoPassaggio interno per il "gestore esecuzione" (quando viene eseguito il codice della pagina)PostRequestHandlerExecute, eventoReleaseRequestState, eventoPassaggio interno per filtrare le risposteUpdateRequestCache, eventoEndRequest, evento
  7. AcquireRequestState, eventoPreRequestHandlerExecute, eventoPassaggio interno per il "gestore esecuzione" (quando viene eseguito il codice della pagina)PostRequestHandlerExecute, eventoReleaseRequestState, eventoPassaggio interno per filtrare le risposteUpdateRequestCache, eventoEndRequest, evento
  8. PreRequestHandlerExecute, eventoPassaggio interno per il "gestore esecuzione" (quando viene eseguito il codice della pagina)PostRequestHandlerExecute, eventoReleaseRequestState, eventoPassaggio interno per filtrare le risposteUpdateRequestCache, eventoEndRequest, evento
  9. Passaggio interno per il "gestore esecuzione" (quando viene eseguito il codice della pagina)PostRequestHandlerExecute, eventoReleaseRequestState, eventoPassaggio interno per filtrare le risposteUpdateRequestCache, eventoEndRequest, evento
  10. PostRequestHandlerExecute, eventoReleaseRequestState, eventoPassaggio interno per filtrare le risposteUpdateRequestCache, eventoEndRequest, evento
  11. ReleaseRequestState, eventoPassaggio interno per filtrare le risposteUpdateRequestCache, eventoEndRequest, evento
  12. Passaggio interno per filtrare le risposteUpdateRequestCache, eventoEndRequest, evento
  13. UpdateRequestCache, eventoEndRequest, evento
  14. EndRequest, evento
Questi eventi possono essere gestiti dai seguenti elementi:
  • Framework interno pagine ASP.NET (ad esempio i passaggi 6, 9 e 12 nell'elenco precedente).
  • Moduli HTTP configurati per l'applicazione. L'elenco predefinito di moduli HTTP è specificato nel file Machine.config.
  • Codice nel file Global.asax con hook tramite il metodoApplication_[On]EventNameo con hook esplicito eseguito quando si aggiungono gestori eventi per un nome di gestore alternativo.
Ogni evento può disporre di sottoscrittori sincroni e asincroni. I sottoscrittori asincroni vengono eseguiti per primi. Non tutti gli eventi vengono sempre eseguiti; il solo evento che viene sempre eseguito èEndRequest. Per questo motivo, tutte le operazioni di pulizia post-richiesta dovranno essere eseguite nell'eventoEndRequest.

NOTA: quasi sempre la risposta effettiva viene inviata al client dopo che è stata completata dall'istanza dell'applicazione (ossia dopoEndRequest).

Application_OnStart e Application_OnEnd

In ASP.NET vengono introdotti gli "eventi" univociApplication_OnStarteApplication_OnEndper assicurare la compatibilità con l'ambiente ASP classico. Questi "eventi" vengono eseguiti solo una volta nella durata dell'applicazione e non per ogni istanza. Se si modificano pertanto membri non statici in questi metodi, la modifica avrà effetto solo su un'istanza dell'applicazione e non su tutte le istanze. È possibile inizializzare un'istanza dell'applicazione nel costruttore oppure eseguendo l'override del metodoInit.

Application_OnStartè l'equivalente logico del costruttore della classe per la classe di applicazione, ma offre un vantaggio: tramite il codice è possibile accedere aHttpContextper la prima richiesta all'applicazione.

Stato dell'applicazione

Si tratta di un dizionario globale di oggetti ad associazione tardiva, introdotto con la tecnologia ASP classica per sopperire alla mancanza di variabili globali in Microsoft Visual Basic Scripting Edition (VBScript). In ASP.NET è possibile accedere allo stato dell'applicazione tramite una delle seguenti proprietà:
  • Application(definita nelle classiHttpApplicationePage)
  • HttpContext.Application
In ASP.NET lo stato dell'applicazione è incluso soprattutto per motivi di compatibilità con l'ambiente ASP classico, al fine di facilitare la migrazione delle applicazioni esistenti ad ASP.NET. Si consiglia di memorizzare dati nei membri statici della classe di applicazione anziché nell'oggettoApplication. Questo consente di ottenere un miglioramento delle prestazioni poiché si accede a una variabile statica più velocemente di quanto sia possibile accedere a un elemento nel dizionario Application.

Per accedere ai membri statici dell'applicazione dalle pagine in Microsoft Visual C# .NET e Microsoft Visual Basic .NET, è necessario utilizzare l'attributoClassNamein Global.asax per assegnare il nome alla classe di applicazione. Ad esempio:
<%@ Application Language="C# | VB" ClassName="MyClass" %>
Se il nome di un membro statico èMyStaticMembernel file Global.asax, sarà possibile utilizzareMyClass.MyStaticMemberper accedervi da una pagina.
Właściwości

Identyfikator artykułu: 312607 — ostatni przegląd: 04/29/2002 18:22:00 — zmiana: 1.0

Microsoft ASP.NET (incluso in .NET Framework)

  • kbgrpdsasp kbhttpruntime kbinfo kbstate KB312607
Opinia