Share via


Cenni preliminari sullo stato delle applicazioni ASP.NET

Aggiornamento: novembre 2007

Lo stato dell'applicazione è un repository di dati disponibile per tutte le classi in un'applicazione ASP.NET. Lo stato dell'applicazione viene archiviato in memoria su server, quindi l'archiviazione e il recupero delle informazioni sono più veloci rispetto al database. A differenza dello stato sessione specifico di ogni sessione utente, lo stato dell'applicazione vale per tutti gli utenti e tutte le sessioni. Pertanto, lo stato dell'applicazione è utile anche per archiviare quantità limitate dei dati più utilizzati che non variano da utente a utente. Per informazioni sul salvataggio dei dati per ciascun utente, vedere Cenni preliminare sullo stato della sessione ASP.NET e Cenni preliminari sulle proprietà dei profili ASP.NET.

Utilizzo dello stato dell'applicazione

Lo stato dell'applicazione è archiviato in un'istanza della classe HttpApplicationState. Questa classe espone un dizionario chiave-valore degli oggetti.

L'istanza HttpApplicationState viene creata al primo accesso di un utente a qualsiasi risorsa URL in un'applicazione. Di solito, si accede alla classe HttpApplicationState con la proprietà Application della classe HttpContext.

È possibile utilizzare lo stato dell'applicazione in due modi: si possono aggiungere o rimuovere valori dall'insieme o si può accedervi con Contents direttamente a livello di codice. È possibile accedere alla classe HttpApplicationState per tutta la durata dell'applicazione. Tuttavia, è spesso utile caricare i dati dello stato dell'applicazione all'avvio dell'applicazione. A tale scopo, è possibile inserire codice per caricare lo stato dell'applicazione nel metodo Application_Start con il file Global.asax. Per ulteriori informazioni, vedere Cenni preliminari sul ciclo di vita delle applicazioni ASP.NET per IIS 5.0 e 6.0.

In alternativa, è possibile aggiungere oggetti all'insieme StaticObjects con una dichiarazione <object > nel file Global.asax dell'applicazione Web. È possibile accedere allo stato dell'applicazione definito con questa modalità dal codice in qualsiasi punto dell'applicazione. Nell'esempio riportato di seguito viene illustrata una dichiarazione dell'oggetto per un valore dello stato dell'applicazione.

<object  scope="application" ID="MyInfo" 
    PROGID="MSWC.MYINFO">
</object>

È possibile aggiungere oggetti all'insieme StaticObjects solamente con il file Global.asax. L'insieme genera un'eccezione NotSupportedException se si tenta di aggiungere direttamente gli oggetti a livello di codice.

È possibile accedere ai membri degli oggetti archiviati nello stato dell'applicazione senza dover fare riferimento all'insieme Application. Nell'esempio di codice riportato di seguito viene illustrato come fare riferimento a un membro di un oggetto definito nell'insieme StaticObjects dello stato dell'applicazione:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
    Label1.Text = MyInfo.Title
End Sub
protected void Page_Load(Object sender, EventArgs e)
    Label1.Text = MyInfo.Title;
End Sub

Considerazioni sullo stato dell'applicazione

Se si utilizza lo stato dell'applicazione, tenere conto delle seguenti considerazioni importanti.

  • Risorse   L'archiviazione dello stato dell'applicazione è molto rapida rispetto al salvataggio dei dati su disco o in un database perché avviene in memoria. Tuttavia, archiviare grandi blocchi di dati nello stato dell'applicazione può esaurire la memoria del server forzando il server ad effettuare un paging della memoria su disco. Anziché di utilizzare lo stato dell'applicazione, è possibile utilizzare il meccanismo della cache ASP.NET per archiviare grandi quantità di dati dell'applicazione. La cache ASP.NET archivia i dati in memoria, quindi è molto veloce. La cache viene gestita attivamente da ASP.NET, che rimuove elementi quando la memoria comincia a esaurirsi. Per ulteriori informazioni, vedere Cenni preliminari sull'inserimento nella cache in ASP.NET.

  • Memoria volatile Lo stato dell'applicazione è archiviato nella memoria del server, quindi viene perso quando l'applicazione è interrotta o riavviata. Ad esempio, se si modifica il file Web.config, l'applicazione viene riavviata e ogni stato dell'applicazione viene perso se tutti i valori dello stato non vengono scritti su un supporto di archiviazione non volatile come, ad esempio, un database.

  • Scalabilità   Lo stato dell'applicazione non viene condiviso tra più server che eseguono la stessa applicazione, come in una Web farm, o tra diversi processi di lavoro che eseguono la stessa applicazione sullo stesso server, come in un Web garden. L'applicazione non può pertanto basarsi su uno stato dell'applicazione contenente gli stessi dati per lo stato dell'applicazione tra server o processi diversi. Se l'applicazione verrà eseguita in ambienti multiprocessore e multiserver, si può scegliere di utilizzare un'opzione più scalabile, come un database, per i dati che devono mantenere la fedeltà durante l'applicazione.

  • Concorrenza   Lo stato dell'applicazione è a thread libero, cioè è possibile accedere ai dati dello stato dell'applicazione contemporaneamente da molti thread. Pertanto, è importante assicurare che l'aggiornamento dei dati dello stato dell'applicazione venga eseguito in modalità thread-safe includendo un supporto di sincronizzazione incorporato. È possibile utilizzare i metodi Lock e UnLock per assicurare l'integrità dei dati consentendo la scrittura dei dati per una sola origine alla volta. È possibile inoltre ridurre la probabilità di problemi di concorrenza inizializzando i valori dello stato dell'applicazione con il metodo Application_Start nel file Global.asax. Per ulteriori informazioni, vedere Cenni preliminari sul ciclo di vita delle applicazioni ASP.NET per IIS 5.0 e 6.0.

Vedere anche

Attività

Procedura: salvare i valori nello stato dell'applicazione

Procedura: leggere i valori dallo stato dell'applicazione

Concetti

Cenni preliminari sulla gestione dello stato ASP.NET

Altre risorse

Novità sulla gestione dello stato ASP.NET