L'oggetto
HttpApplication
di 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 oggetto
Application
di Microsoft Active Server Pages (ASP).
Questo articolo è suddiviso nelle seguenti sezioni:
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 da
System.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'evento
EndRequest
che 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'oggetto
this
o
Me.
-
Da una pagina; ogni pagina include una proprietà
ApplicationInstance
tipizzata in modo sicuro.
-
Dall'oggetto
HttpContext; utilizzare la proprietà
HttpContext.ApplicationInstance
(che viene immessa come
HttpApplication).
NOTA: poiché
Application
si riferisce al dizionario dello stato di applicazione globale nell'ambiente ASP classico, ASP.NET utilizza
ApplicationInstance
e non
Application
come 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:
-
BeginRequest, evento
AuthenticateRequest, evento
DefaultAuthentication, evento interno
AuthorizeRequest, evento
ResolveRequestCache, evento
Passaggio interno per il "gestore mappe" (durante la compilazione viene creata l'istanza di una pagina)
AcquireRequestState, evento
PreRequestHandlerExecute, evento
Passaggio interno per il "gestore esecuzione" (quando viene eseguito il codice della pagina)
PostRequestHandlerExecute, evento
ReleaseRequestState, evento
Passaggio interno per filtrare le risposte
UpdateRequestCache, evento
EndRequest, evento
-
AuthenticateRequest, evento
DefaultAuthentication, evento interno
AuthorizeRequest, evento
ResolveRequestCache, evento
Passaggio interno per il "gestore mappe" (durante la compilazione viene creata l'istanza di una pagina)
AcquireRequestState, evento
PreRequestHandlerExecute, evento
Passaggio interno per il "gestore esecuzione" (quando viene eseguito il codice della pagina)
PostRequestHandlerExecute, evento
ReleaseRequestState, evento
Passaggio interno per filtrare le risposte
UpdateRequestCache, evento
EndRequest, evento
-
DefaultAuthentication, evento interno
AuthorizeRequest, evento
ResolveRequestCache, evento
Passaggio interno per il "gestore mappe" (durante la compilazione viene creata l'istanza di una pagina)
AcquireRequestState, evento
PreRequestHandlerExecute, evento
Passaggio interno per il "gestore esecuzione" (quando viene eseguito il codice della pagina)
PostRequestHandlerExecute, evento
ReleaseRequestState, evento
Passaggio interno per filtrare le risposte
UpdateRequestCache, evento
EndRequest, evento
-
AuthorizeRequest, evento
ResolveRequestCache, evento
Passaggio interno per il "gestore mappe" (durante la compilazione viene creata l'istanza di una pagina)
AcquireRequestState, evento
PreRequestHandlerExecute, evento
Passaggio interno per il "gestore esecuzione" (quando viene eseguito il codice della pagina)
PostRequestHandlerExecute, evento
ReleaseRequestState, evento
Passaggio interno per filtrare le risposte
UpdateRequestCache, evento
EndRequest, evento
-
ResolveRequestCache, evento
Passaggio interno per il "gestore mappe" (durante la compilazione viene creata l'istanza di una pagina)
AcquireRequestState, evento
PreRequestHandlerExecute, evento
Passaggio interno per il "gestore esecuzione" (quando viene eseguito il codice della pagina)
PostRequestHandlerExecute, evento
ReleaseRequestState, evento
Passaggio interno per filtrare le risposte
UpdateRequestCache, evento
EndRequest, evento
-
Passaggio interno per il "gestore mappe" (durante la compilazione viene creata l'istanza di una pagina)
AcquireRequestState, evento
PreRequestHandlerExecute, evento
Passaggio interno per il "gestore esecuzione" (quando viene eseguito il codice della pagina)
PostRequestHandlerExecute, evento
ReleaseRequestState, evento
Passaggio interno per filtrare le risposte
UpdateRequestCache, evento
EndRequest, evento
-
AcquireRequestState, evento
PreRequestHandlerExecute, evento
Passaggio interno per il "gestore esecuzione" (quando viene eseguito il codice della pagina)
PostRequestHandlerExecute, evento
ReleaseRequestState, evento
Passaggio interno per filtrare le risposte
UpdateRequestCache, evento
EndRequest, evento
-
PreRequestHandlerExecute, evento
Passaggio interno per il "gestore esecuzione" (quando viene eseguito il codice della pagina)
PostRequestHandlerExecute, evento
ReleaseRequestState, evento
Passaggio interno per filtrare le risposte
UpdateRequestCache, evento
EndRequest, evento
-
Passaggio interno per il "gestore esecuzione" (quando viene eseguito il codice della pagina)
PostRequestHandlerExecute, evento
ReleaseRequestState, evento
Passaggio interno per filtrare le risposte
UpdateRequestCache, evento
EndRequest, evento
-
PostRequestHandlerExecute, evento
ReleaseRequestState, evento
Passaggio interno per filtrare le risposte
UpdateRequestCache, evento
EndRequest, evento
-
ReleaseRequestState, evento
Passaggio interno per filtrare le risposte
UpdateRequestCache, evento
EndRequest, evento
-
Passaggio interno per filtrare le risposte
UpdateRequestCache, evento
EndRequest, evento
-
UpdateRequestCache, evento
EndRequest, evento
-
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 metodo
Application_[On]EventName
o 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'evento
EndRequest.
NOTA: quasi sempre la risposta effettiva viene inviata al client dopo che è stata completata dall'istanza dell'applicazione (ossia dopo
EndRequest).
Application_OnStart e Application_OnEnd
In ASP.NET vengono introdotti gli "eventi" univoci
Application_OnStart
e
Application_OnEnd
per 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 metodo
Init.
Application_OnStart
è l'equivalente logico del costruttore della classe per la classe di applicazione, ma offre un vantaggio: tramite il codice è possibile accedere a
HttpContext
per 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 classi
HttpApplication
e
Page)
-
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'oggetto
Application. 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'attributo
ClassName
in 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 è
MyStaticMember
nel file Global.asax, sarà possibile utilizzare
MyClass.MyStaticMember
per accedervi da una pagina.
Identificativo articolo: 312607 - Ultima modifica: lunedì 29 aprile 2002 - Revisione: 1.0
Le informazioni in questo articolo si applicano a:
- Microsoft ASP.NET (incluso in .NET Framework)
| kbgrpdsasp kbhttpruntime kbinfo kbstate KB312607 |
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.
Dichiarazione di non responsabilità per articoli della Microsoft Knowledge Base su prodotti non più supportatiQuesto articolo è stato scritto sui prodotti per cui Microsoft non offre più supporto. L?articolo, quindi, viene offerto ?così come è? e non verrà più aggiornato.