ASP.NET State Management

 Introduzione

Le richieste web  si basano sul protocollo HTTP che a causa della sua architettura state-less non è in grado di memorizzare  le informazioni relative alle richieste effettuate. Questo implica che ogni informazione relativa allo stato  necessita di essere gestita tramite l’implementazione di codice applicativo.  Esistono diversi metodi per la memorizzazione dello stato, ciascuno dei quali può essere più o meno adeguato a seconda della situazione. I metodi di gestione dello stato si suddividono in due macro gruppi: Client-based state management e Server-base state management.

 

State management schema ASP.NET

 

 

Quale tipologia utilizzare?

La scelta di una tipologia di memorizzazione è condizionata da diversi parametri: il numero di server sulla quale deve essere pubblicata l’applicazione, quante informazioni devono essere condivise tra i server, la complessità dell’applicazione; La principale differenza tra la memorizzazione lato client e quella lato server è che nel primo caso tutte le informazioni vengono memorizzate all’interno del client ed inviate al server dopo ogni richiesta, mentre nel secondo caso tutte le informazioni vengono memorizzate lato server e l’accesso ad esse avviene tramite un id di sessione memorizzato nel client.

In generale, la memorizzazione dello stato sul client porta i seguenti vantaggi:

  • Migliore scalabilità: nel caso della memorizzazione server-based  la memoria utilizzata è quella del server, per questo motivo potrebbero nascere dei problemi a livello di prestazioni se il numero di richieste è molto elevato. Delegando questo incarico ai client richiedenti, il problema del consumo della memoria è trascurabile;
  • Supporto di web farm e web garden:  utilizzando la tecnica client-based  è possibile distribuire le richieste tra più server, in questo caso il client ha tutte le informazioni di stato necessarie e i server si devono occupare solo dell’elaborazione della richiesta. Se si utilizzasse la memorizzazione server-based i server dovrebbero condividere tutte le informazioni di tutti i client in modo da gestire al meglio la sessione;

Memorizzare le informazioni sul server porta i seguenti vantaggi:

  • Sicurezza: Le informazioni client-based sono liberamente modificabili dall’utente: si consiglia di non utilizzare la tecnica client-based per  la memorizzazione di informazioni sensibili come le password;
  • Minore consumo di connessione: La trasmissione delle informazioni tra il client e il server possono causare un consumo di connessione non indifferente, per questo occorre utilizzare la tecnica server-based;

 

Client-based State management

Di seguito vengono illustrate la principali tecniche client-based.

View State

Il view state è il metodo utilizzato da ASP.NET per trasferire le informazioni relative ai controlli da una richiesta all’altra. Le informazioni vengono scritte come parte integrante della pagina attraverso  un controllo di tipo hidden identificabile con il nome  “__VIEWSTATE”, al suo interno viene codificata una stringa contenente le informazioni. E’ possibile accedere alle informazioni attraverso l’oggetto Page.ViewState.

Hidden fields

Le hidden fields sono dei campi HTML che vengono nascosti all’utente. Le informazioni inserite in questi campi non vengono criptate quindi l’utente può modificarle e cancellarle, per questo è sconsigliato memorizzare dati sensibili al loro interno.

Cookies

I cookie sono file di piccole dimensioni memorizzati all’interno del file system del client. Esistono due tipologie di cookie : quelli persistenti, che continuano ad esistere anche dopo la chiusura del browser e quelli temporanei, che  possono avere una data di scadenza. E’ sconsigliato l’uso dei cookie per la memorizzazione di dati sensibili quali username e password.

Di seguito, un esempio di scrittura/lettura su cookie:

 

Query String

Le query string sono le informazioni concatenate nell’URL della pagina. E’ possibile accedere ai valori visualizzati  attraverso il dizionario Request.QueryString.

Di seguito un esempio sull’utilizzo dell’oggetto QueryString:

http://www.microsoft.com/it-it/search/results.aspx?mkt=it-it&setlang=it-it&q=prova

Server-based state management

Di seguito sono illustrate le tecniche server-based.

Application State

L’Application state è una tecnica di memorizzazione globale dei  dati che necessitano di essere accessibili da tutte le pagine dell’applicazione. E’ possibile utilizzare l’Application state attraverso la proprietà Page.Application di tipo HttpApplicationState, la classe rappresenta un dizionario con coppie chiave – valore. Questa tecnica è ottima per la memorizzazione di tutti i dati generici che non riguardano un utente. I dati memorizzati in Page.Application saranno persi ogni volta che viene riavviata l’applicazione, inoltre la memoria utilizzata sarà quella del server, e’ sconsigliato l’uso per una grande quantità di dati.

Session state

Il Session state è molto simile all’Application state, l’unica differenza è che i dati memorizzati sono relativi al singolo Utente che sta utilizzando l’applicazione. Di default il Session state memorizza i dati all’interno della memoria del Server, ma e’ possibile configurare l’applicazione in modo da salvare i dati all’interno di un altro server o addirittura memorizzarli su Database.

 

Session state mode

ASP.NET Session state offre differenti modalità di memorizzazione dei dati:

  • InProc(default): Memorizza i dati nella memoria del web server. E’ una modalità molto veloce, ma dev’essere abbandonata quando l’applicazione viene installata in una web farm;
  • StateServer: Memorizza i dati in un servizio chiamato “ASP.NET State Service”. I dati rimangono in memoria anche dopo il riavvio dell’applicazione e sono accessibili da altri server;
  • SqlServer: Memorizza i dati all’interno di un SQL Server database. Oltre a garantire l’accesso delle informazioni da più server, offre anche un’elevata robustezza dei dati memorizzati;
  • Custom: E’ possibile utilizzare un provider personalizzato. Questa modalità permette di implementare un provider per la memorizzazione dei dati di sessione;