Cenni preliminari sulla gestione dello stato ASP.NET
Aggiornamento: novembre 2007
Una nuova istanza della classe della pagina Web viene creata a ogni invio della pagina al server. Con le tradizionali metodologie di programmazione Web, tutte le informazioni associate alla pagina e i controlli in essa presenti verrebbero persi a ogni round trip. Se un utente immettesse ad esempio informazioni in una casella di testo, tali informazioni andrebbero perse nel round trip tra il browser o la periferica client e il server.
Per superare questo limite della programmazione Web tradizionale, in ASP.NET sono disponibili diverse opzioni che consentono di mantenere i dati sia nella pagina, sia nell'applicazione. Di seguito sono riportate queste funzionalità:
ViewState
Stato di controllo
Campi nascosti
Cookie
Stringhe di query
Stato applicazione
Stato sessione
Proprietà di profilo
Lo stato di visualizzazione, lo stato di controllo, i cookie e le stringhe di query implicano in vari modi l'archiviazione dei dati nel client. Diversamente, lo stato applicazione, lo stato sessione e le proprietà di profilo archiviano i dati in memoria nel server. Ogni opzione offre vantaggi e svantaggi distinti, a seconda dello scenario.
Opzioni di gestione dello stato basate su client
Nelle sezioni riportate di seguito vengono descritte le opzioni per la gestione dello stato che implicano la memorizzazione delle informazioni nella pagina o nel computer client. Con queste opzioni, nessuna informazione viene mantenuta sul server tra i round trip.
Stato di visualizzazione
La proprietà ViewState fornisce un oggetto dizionario per conservare i valori tra le varie richieste di una stessa pagina. È il metodo predefinito utilizzato dalla pagina per mantenere i valori delle proprietà dei controlli e della pagina stessa tra i vari round trip.
Durante l'elaborazione della pagina, per lo stato corrente della pagina e dei controlli viene generato un hash in una stringa, quindi viene salvato nella pagina come campo nascosto o, se la quantità di dati archiviati nella proprietà ViewState è superiore al valore specificato nella proprietà MaxPageStateFieldLength, come più campi nascosti. Al postback della pagina al server, la pagina analizza la stringa dello stato di visualizzazione in fase di inizializzazione e ripristina le informazioni sulle proprietà.
Nello stato di visualizzazione è possibile memorizzare anche i valori. Per ulteriori informazioni sull'utilizzo dello stato di visualizzazione, vedere Cenni preliminari sullo stato di visualizzazione ASP.NET. Per consigli su quando utilizzare lo stato di visualizzazione, vedere Suggerimenti per la gestione dello stato di ASP.NET.
Stato di controllo
Affinché un controllo funzioni correttamente, può essere necessario archiviarne i dati dello stato. Per funzionare nel modo previsto, ad esempio, un controllo personalizzato che visualizza informazioni diverse in schede diverse deve essere in grado di riconoscere quale scheda viene selezionata tra i round trip. A questo scopo può essere utilizzata la proprietà ViewState. È tuttavia possibile che lo stato di visualizzazione venga disattivato a livello di pagina in fase di sviluppo e che nel controllo si verifichino degli errori. Per risolvere il problema, nel framework delle pagine ASP.NET è esposta una funzionalità in ASP.NET denominata stato di controllo.
La proprietà ControlState consente di mantenere le informazioni specifiche per un controllo e, diversamente dalla proprietà ViewState, non può essere disattivata.
Campi nascosti
ASP.NET consente di archiviare le informazioni in un controllo HiddenField, di cui esegue il rendering come campo nascosto HTML standard. Un campo nascosto non esegue il rendering in modo visivo nel browser, ma è possibile impostare le relative proprietà come si farebbe con un controllo standard. Quando una pagina viene inviata al server, il contenuto di un campo nascosto viene inviato nell'insieme di form HTTP insieme ai valori di altri controlli. Un campo nascosto funge da archivio per le informazioni specifiche della pagina che si desidera memorizzare direttamente nella pagina.
Nota sulla sicurezza: |
---|
Il contenuto di un campo nascosto può essere facilmente visualizzato e modificato da un utente malintenzionato. Non memorizzare in un campo nascosto alcuna informazioni riservata o su cui si basa il corretto funzionamento dell'applicazione. Per ulteriori informazioni, vedere Suggerimenti per la gestione dello stato di ASP.NET. |
Un controllo HiddenField archivia una singola variabile nella relativa proprietà Value e deve essere aggiunto alla pagina in modo esplicito. Per ulteriori informazioni, vedere Cenni preliminari sul controllo server Web HiddenField.
Per rendere disponibili i valori dei campi nascosti durante l'elaborazione delle pagine, è necessario inviare la pagina tramite un comando HTTP POST. Se si utilizzano campi nascosti e una pagina viene elaborata in risposta a una richiesta di collegamento o a un comando HTTP GET, i campi nascosti non risulteranno disponibili. Per consigli sull'utilizzo, vedere Suggerimenti per la gestione dello stato di ASP.NET.
Cookie
Un cookie è costituito da una piccola quantità di dati memorizzati in un file di testo nel file system del client o in memoria nella sessione del browser client. Nel cookie sono contenute le informazioni specifiche del sito che il server invia al client insieme all'output della pagina. I cookie possono essere temporanei, con date e tempi di scadenza specifici, o persistenti.
È possibile utilizzare i cookie per memorizzare informazioni su un determinato client, sessione o applicazione. I cookie vengono salvati nella periferica client. Quando il browser richiede una pagina, il client invia le informazioni presenti nel cookie insieme alle informazioni relative alla richiesta. Il server potrà quindi leggere il cookie ed estrarne il valore. Un utilizzo tipico consiste nel memorizzare un token, in genere crittografato, che indica che l'utente è già stato autenticato nell'applicazione.
Nota sulla sicurezza: |
---|
Il browser può rinviare al server solo i dati originariamente creati dal cookie. Un utente malintenzionato potrebbe tuttavia accedere ai cookie e leggerne il contenuto. Si consiglia pertanto di non archiviare in un cookie informazioni riservate, quali nomi utente o password. Archiviare un token nel cookie di identificazione dell'utente, quindi utilizzare il token per individuare le informazioni riservate nel server. |
Per ulteriori informazioni sull'utilizzo dei cookie, vedere Cookies e Suggerimenti per la gestione dello stato di ASP.NET.
Stringhe di query
Una stringa di query rappresenta le informazioni aggiunte alla fine dell'URL di una pagina ed è solitamente simile alla seguente:
https://www.contoso.com/listwidgets.aspx?category=basic&price=100
Nel percorso URL sopra riportato, la stringa di query inizia con un punto interrogativo (?) e include due coppie attributo/valore, una definita "category" e l'altra "price".
Le stringhe di query forniscono un metodo semplice ma limitato per gestire le informazioni sullo stato. Consentono di passare in modo semplice le informazioni da una pagina all'altra, ad esempio il numero di un prodotto a un'altra pagina in cui verrà elaborato. In alcuni browser e periferiche client la lunghezza dell'URL non può superare il limite di 2083 caratteri.
Nota sulla sicurezza: |
---|
Le informazioni passate in una stringa di query possono venire alterate da un utente malintenzionato. Non utilizzare stringhe di query per trasferire dati importanti o riservati. Un utente può inoltre assegnare un segnalibro all'URL o inviare l'URL ad altri utenti, passando quindi a questi ultimi anche le informazioni riservate contenute nell'URL. Per ulteriori informazioni, vedere Suggerimenti per la gestione dello stato di ASP.NET e Procedura: proteggere da attacchi tramite script in un'applicazione Web applicando alle stringhe la codifica HTML. |
Affinché i valori delle stringhe di query siano disponibili durante l'elaborazione delle pagine, è necessario inviare la pagina tramite un metodo HTTP GET. Pertanto, se una pagina viene elaborata in risposta a un metodo HTTP POST, non sarà possibile usufruire della stringa di query. Per consigli sull'utilizzo, vedere Suggerimenti per la gestione dello stato di ASP.NET.
Opzioni di gestione dello stato basate su server
In ASP.NET sono disponibili diversi metodi che consentono di gestire le informazioni sullo stato nel server, anziché mantenerle nel client. La gestione dello stato basata su server consente di ridurre la quantità di informazioni che deve essere inviata al client per il mantenimento dello stato. È tuttavia possibile che nel server vengano utilizzate risorse impegnative. Nelle sezioni seguenti vengono descritte tre funzionalità di gestione dello stato basate su server: lo stato applicazione, lo stato sessione e le proprietà di profilo.
Stato applicazione
In ASP.NET è possibile salvare i valori utilizzando lo stato applicazione, ovvero un'istanza della classe HttpApplicationState, per ciascuna applicazione Web attiva. Lo stato applicazione è un meccanismo di archiviazione generale accessibile da tutte le pagine nell'applicazione Web e consente di archiviare le informazioni che devono essere mantenute tra i round trip al server e tra le richieste di pagine. Per ulteriori informazioni, vedere Cenni preliminari sullo stato delle applicazioni ASP.NET.
Lo stato applicazione è archiviato in un dizionario chiave-valore che viene creato durante ciascuna richiesta a un URL specifico. È possibile aggiungere le informazioni specifiche delle applicazioni a questa struttura per memorizzarle tra le richieste delle pagine.
Una volta aggiunte le informazioni specifiche dell'applicazione all'oggetto stato applicazione, queste verranno gestite dal server. Per consigli sull'utilizzo, vedere Suggerimenti per la gestione dello stato di ASP.NET.
Stato sessione
In ASP.NET è possibile salvare i valori utilizzando lo stato sessione, ovvero un'istanza della classe HttpSessionState, per ciascuna sessione di applicazione Web attiva. Per informazioni generali, vedere Cenni preliminare sullo stato della sessione ASP.NET.
Lo stato sessione è simile allo stato applicazione, ma è limitato all'ambito della sessione del browser corrente. Se l'applicazione viene utilizzata da più utenti, ciascuno di questi disporrà di uno stato sessione diverso. Inoltre, se un utente chiude l'applicazione e la riavvia in un secondo momento, alla seconda sessione dell'utente corrisponderà uno stato sessione diverso dal primo.
Lo stato sessione è strutturato come un dizionario chiave/valore per l'archiviazione delle informazioni specifiche delle sessioni che devono essere conservate tra i round trip al server e tra le richieste di pagine. Per ulteriori informazioni, vedere Cenni preliminare sullo stato della sessione ASP.NET.
Lo stato sessione può essere utilizzato per eseguire le seguenti attività:
Identificare in modo univoco le richieste del browser o della periferica client ed eseguire il mapping di tali richieste a una singola istanza della sessione sul server.
Memorizzare i dati specifici della sessione sul server da utilizzare tra più richieste del browser o della periferica client all'interno della stessa sessione.
Generare gli eventi per la gestione della sessione appropriati. Inoltre, è possibile scrivere il codice dell'applicazione utilizzando questi eventi.
Una volta aggiunte le informazioni specifiche dell'applicazione allo stato sessione, queste verranno gestite dal server. A seconda delle opzioni specificate, è possibile memorizzare le informazioni sulla sessione in cookie, in un server out-of-process o in un computer in cui è installato Microsoft SQL Server. Per consigli sull'utilizzo, vedere Suggerimenti per la gestione dello stato di ASP.NET.
Proprietà di profilo
In ASP.NET è disponibile una funzionalità, denominata proprietà di profilo, che consente di archiviare dati specifici dell'utente. Questa funzionalità è analoga allo stato sessione, ma i dati del profilo vengono mantenuti anche oltre la scadenza della sessione dell'utente. Nella funzionalità di proprietà di profilo è utilizzato un profilo ASP.NET, archiviato in un formato persistente e associato a un singolo utente. Il profilo ASP.NET consente di gestire con facilità le informazioni sull'utente, senza che sia necessario creare e gestire un database. Il profilo inoltre rende disponibili le informazioni sull'utente utilizzando un'API fortemente tipizzata, a cui è possibile accedere da qualsiasi punto nell'applicazione. Nel profilo possono essere archiviati oggetti di qualsiasi tipo. La funzionalità di profilo ASP.NET fornisce un sistema di archiviazione generico che consente di definire e gestire quasi ogni tipo di dati, nonché di mantenere i dati disponibili in modalità indipendente dai tipi.
Per utilizzare le proprietà di profilo, è necessario configurare un provider di profili. In ASP.NET è disponibile una classe SqlProfileProvider che consente di archiviare i dati del profilo in un database SQL. È inoltre possibile creare una classe del provider di profili per archiviare i dati del profilo in un formato personalizzato, nonché in un meccanismo di archiviazione personalizzato, ad esempio un file XML, o in un servizio Web.
I dati inseriti nelle proprietà di profilo non sono archiviati nella memoria dell'applicazione e vengono pertanto preservati attraverso i riavvii di Internet Information Services (IIS) e del processo di lavoro senza alcuna perdita. Le proprietà di profilo possono inoltre essere mantenute attraverso più processi, ad esempio in Web farm o in Web garden. Per ulteriori informazioni, vedere Cenni preliminari sulle proprietà dei profili ASP.NET.
Vedere anche
Concetti
Suggerimenti per la gestione dello stato di ASP.NET
Cenni preliminari sui cookie ASP.NET
Cenni preliminari sullo stato di visualizzazione ASP.NET
Cenni preliminare sullo stato della sessione ASP.NET