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

Traduzione articoli Traduzione articoli
Identificativo articolo: 312607 - Visualizza i prodotti a cui si riferisce l?articolo.
Questo articolo Ŕ stato precedentemente pubblicato con il codice di riferimento I312607
Espandi tutto | Chiudi tutto

In questa pagina

Sommario

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:

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 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:
  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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
  7. 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
  8. 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
  9. 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
  10. PostRequestHandlerExecute, evento ReleaseRequestState, evento Passaggio interno per filtrare le risposte UpdateRequestCache, evento EndRequest, evento
  11. ReleaseRequestState, evento Passaggio interno per filtrare le risposte UpdateRequestCache, evento EndRequest, evento
  12. Passaggio interno per filtrare le risposte UpdateRequestCache, evento EndRequest, evento
  13. UpdateRequestCache, evento EndRequest, 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 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.

ProprietÓ

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)
Chiavi:á
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¨ 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.

Invia suggerimenti

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com