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

Dichiarazione di non responsabilità per contenuto KB ritirato

Il contenuto di questo articolo è riferito a prodotti per cui Microsoft non offre più il supporto. Questo articolo viene pertanto offerto "così com'è" e non sarà più aggiornato.

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à

ID articolo: 312607 - Ultima revisione: 29 apr 2002 - Revisione: 1

Feedback