ASP.NET stato sessione

 

Rob Howard
Microsoft Corporation

28 dicembre 2000

Nota Il codice in questo articolo è destinato alla versione beta di Microsoft .NET. Alcuni dei codici possono richiedere la rielaborazione per funzionare correttamente nelle versioni successive di .NET Framework.

Nella colonna di questo mese si prenderà il ritmo un po' e si esaminerà direttamente alcune delle nuove funzionalità di ASP.NET. Si inizierà confrontando ASP.NET stato sessione con ASP classico, quindi visualizzare codice ed esempi per come configurare e usare lo stato della sessione ASP.NET.

Una sessione viene definita come periodo di tempo in cui un utente univoco interagisce con un'applicazione Web. Gli sviluppatori di Active Server Pages (ASP) che desiderano conservare i dati per sessioni utente univoche possono usare una funzionalità intrinseca nota come stato sessione.

A livello di codice, lo stato della sessione non è più della memoria nella forma di un dizionario o di una tabella hash, ad esempio coppie chiave-valore, che possono essere impostate e lette per la durata della sessione di un utente. Ad esempio, un utente seleziona le scorte da tenere traccia e l'applicazione Web può archiviare questi valori nell'istanza della sessione ASP dell'utente:

Session("Stocks") = "MSFT; VRSN; GE"

Nelle pagine successive questi valori vengono letti e l'applicazione Web ha accesso a questi valori senza che l'utente li immette nuovamente:

' Get Stocks, split string, etc.
Dim StockString
StockString = Session("Stocks")

ASP mantiene lo stato della sessione fornendo al client una chiave univoca assegnata all'utente all'inizio della sessione. Questa chiave viene archiviata in un cookie HTTP che il client invia al server in ogni richiesta. Il server può quindi leggere la chiave dal cookie e rigonfiare lo stato della sessione del server.

Problemi con lo stato della sessione ASP

Gli sviluppatori ASP conoscono lo stato della sessione come una grande funzionalità, ma uno che è leggermente limitato. tra cui:

  • Processo dipendente. Lo stato della sessione ASP esiste nel processo che ospita ASP; pertanto le azioni che influiscono sul processo influiscono anche sullo stato della sessione. Quando il processo viene riciclato o ha esito negativo, lo stato della sessione viene perso.
  • Limitazioni della server farm. Quando gli utenti passano dal server al server in una server farm Web, lo stato della sessione non li segue. Lo stato della sessione ASP è specifico del computer. Ogni server ASP fornisce lo stato della sessione e, a meno che l'utente non torni allo stesso server, lo stato della sessione non è accessibile. Anche se le soluzioni di routing a livello di IP di rete possono risolvere tali problemi, assicurandosi che gli INDIRIZZI IP client vengano indirizzati al server di origine, alcuni ISP scelgono di usare una soluzione di bilanciamento del carico proxy per i client. La maggior parte di queste è AOL. Soluzioni come AOL impedisce il routing a livello di rete delle richieste ai server perché gli indirizzi IP per il richiedente non possono essere garantiti univoci.
  • Cookie dipendente. I client che non accettano cookie HTTP non possono sfruttare lo stato della sessione. Alcuni client ritengono che i cookie compromettereno la sicurezza e/o la privacy e quindi disabilitarli, che disabilita lo stato della sessione sul server.

Questi sono diversi set di problemi che sono stati presi in considerazione nella progettazione dello stato della sessione di ASP.NET.

ASP.NET stato sessione

ASP.NET stato sessione risolve tutti i problemi precedenti associati allo stato della sessione ASP classica:

  • Elaborare indipendentemente. ASP.NET stato sessione è in grado di eseguire in un processo separato dal processo host ASP.NET. Se lo stato della sessione è in un processo separato, il processo di ASP.NET può venire e andare mentre il processo di stato della sessione rimane disponibile. Naturalmente, è comunque possibile usare lo stato della sessione nel processo simile a ASP classico, anche.
  • Supporto per le configurazioni della server farm. Passando a un modello out-of-process, ASP.NET risolve anche il problema della server farm. Il nuovo modello out-of-process consente a tutti i server della farm di condividere un processo di stato della sessione. È possibile implementare questa operazione modificando la configurazione ASP.NET in modo che punti a un server comune.
  • Cookie indipendente. Anche se le soluzioni al problema della gestione dello stato senza cookie esistono per ASP classico, non sono semplici da implementare. ASP.NET, invece, riduce le complessità dello stato della sessione senza cookie a un'impostazione di configurazione semplice.

Esaminiamo ognuna di queste funzionalità in modo più dettagliato, incluso il modo in cui vengono configurate le impostazioni.

Uso dello stato della sessione di ASP.NET

Le impostazioni dello stato della sessione in ASP.NET vengono configurate tramite il file di configurazione XML ASP.NET config.web. Si esaminerà config.web in modo più dettagliato in una colonna successiva, ma per questa discussione sullo stato della sessione verrà esaminata brevemente.

Config.web

Esistono due tipi di file di configurazione: un file di configurazione del computer e un file di configurazione dell'applicazione, entrambi denominati config.web. I due sono identici, ad eccezione del fatto che il file di configurazione del computer applica le impostazioni a tutte le applicazioni, ma i file di configurazione dell'applicazione sono restrittivi o espansivi su base applicazione.

In Beta 1 il file machine config.web si trova nella directory WinNT\Microsoft.NET\Framework\v1.0.2204 , mentre i file di configurazione dell'applicazione facoltativi esistono nella directory dell'applicazione. I file config.web dell'applicazione sono facoltativi nel senso che se non esiste un file application config.web , vengono usate invece le impostazioni machine config.web . ASP.NET impostazioni dello stato della sessione possono essere eseguite nel file config.web del computer e sottoposto a override in un determinato file config.web dell'applicazione.

Nota: Le modifiche apportate a config.web vengono applicate immediatamente, a differenza di ASP classico, in cui il server deve essere arrestato e avviato per avere effetto sulle impostazioni.

Configurazione della sessione

Di seguito è riportato un file config.web di esempio usato per configurare le impostazioni dello stato della sessione per un'applicazione ASP.NET:

<configuration>
  <sessionstate 
      mode="inproc"
      cookieless="false" 
      timeout="20" 
      sqlconnectionstring="data source=127.0.0.1;user id=<user id>;password=<password>"
      server="127.0.0.1" 
      port="42424" 
  />
</configuration>

Le impostazioni precedenti vengono usate per configurare ASP.NET stato sessione. Esaminiamo ogni dettaglio e esaminiamo i vari usi in seguito.

  • Mode. L'impostazione della modalità supporta tre opzioni: inproc, sqlserver e stateserver. Come indicato in precedenza, ASP.NET supporta due modalità: in fase di elaborazione e fuori processo. Sono disponibili anche due opzioni per la gestione dello stato out-of-process: memoria basata su (stateserver) e SQL Server basata su (sqlserver). Verrà illustrato l'implementazione di queste opzioni a breve.
  • Cookieless. L'opzione senza cookie per ASP.NET è configurata con questa semplice impostazione booleana.
  • Timeout. Questa opzione controlla la durata di una sessione considerata valida. Il timeout della sessione è un valore scorrevole; in ogni richiesta il periodo di timeout viene impostato sul tempo corrente più il valore di timeout
  • Sqlconnectionstring. Sqlconnectionstring identifica la stringa di connessione del database che nomi il database usato per la modalità sqlserver.
  • Server. Nel server di stato in modalità out-of-process il server che esegue il servizio Windows NT richiesto: ASPState.
  • Porta. L'impostazione della porta, che accompagna l'impostazione del server, identifica il numero di porta che corrisponde all'impostazione del server per il server di stato della modalità.

Applicazione stato sessione di esempio

Prima di usare lo stato della sessione, è necessario un'applicazione per testarla. Di seguito è riportato il codice per un'applicazione Visual Basic® semplice che scrive e legge dallo stato della sessione, SessionState.aspx:

<Script runat=server>
  Sub Session_Add(sender As Object, e As EventArgs)
     Session("MySession") = text1.Value
     span1.InnerHtml = "Session data updated! <P>
                        Your session contains: <font color=red>" +
                        Session("MySession").ToString() + "</font>"
  End Sub

  Sub CheckSession(sender As Object, e As EventArgs)
    If (Session("MySession") = Isnull) Then
      span1.InnerHtml = "NOTHING, SESSION DATA LOST!"
    Else
      span1.InnerHtml = "Your session contains: 
                         <font color=red>" +             
                         Session("MySession").ToString() + "</font>"
    End If
  End Sub
</Script>

<form runat=server>
  <input id=text1 type=text runat=server>
  <input type=submit runat=server 
              OnServerClick="Session_Add" Value="Add to Session State">
  <input type=submit runat=server 
              OnServerClick="CheckSession" Value="View Session State">
</form>
<hr size=1>
<font size=6><span id=span1 runat=server/></font>

Questa pagina semplice collega due eventi lato server per i pulsanti Aggiungi e Visualizzazione e imposta semplicemente lo stato della sessione sul valore nella casella di testo.

Esistono quattro impostazioni di configurazione generali che è possibile esaminare in modo più dettagliato: modalità in-process, modalità out-of-process, modalità SQL Server e Cookieless.

Modalità in-process

La modalità in-process significa semplicemente usare ASP.NET stato sessione in modo analogo allo stato della sessione ASP classica. Vale a dire, lo stato della sessione viene gestito nel processo e, se il processo viene ri ciclizzato, lo stato viene perso. Dato che le nuove impostazioni fornite da ASP.NET forniscono, potrebbe essere necessario chiedersi perché si userebbe mai questa modalità. Il motivo è abbastanza semplice: prestazioni. Le prestazioni dello stato della sessione, ad esempio il tempo necessario per leggere e scrivere nel dizionario dello stato della sessione, saranno molto più veloci quando la memoria in lettura e da è in fase di elaborazione, poiché le chiamate tra processi aggiungono sovraccarico quando i dati vengono eseguito il marshalling dei dati o eventualmente letti da SQL Server.

La modalità in-process è l'impostazione predefinita per ASP.NET. Quando viene usata questa impostazione, l'unica altra impostazione config.web usata è il timeout senza cookie e il timeout.

Se si chiama SessionState.aspx, impostare un valore dello stato della sessione e arrestare e avviare il processo di ASP.NET (iisreset), il valore impostato prima del ciclo del processo verrà perso.

Modalità out-of-process

Incluso con .NET SDK è un servizio Windows® NT: ASPState. Questo servizio Windows è quello che ASP.NET usa per la gestione dello stato della sessione out-of-process. Per usare questo gestore stati, è prima necessario avviare il servizio. Per avviare il servizio, aprire un prompt dei comandi e digitare:

net start aspstate

Quello che verrà visualizzato è:

Figura 1. Avvio del servizio Windows NT ASPState al prompt dei comandi

A questo punto, l'ASPState del servizio Windows NT è stato avviato ed è disponibile per ASP.NET. È quindi necessario configurare ASP.NET per sfruttare questo servizio. A tale scopo, è necessario configurare config.web:

<configuration>
  <sessionstate 
      mode="stateserver"
      cookieless="false" 
      timeout="20" 
      sqlconnectionstring="data source=127.0.0.1;user id=<user id>;password=<password>"
      server="127.0.0.1" 
      port="42424" 
  />
</configuration>

È stato modificato solo dalla inproc modalità a stateserver mode. Questa impostazione indica ASP.NET cercare il servizio stato ASP nel server specificato nelle server impostazioni e port , in questo caso, il server locale.

È ora possibile chiamare SessionState.aspx, impostare un valore dello stato della sessione, arrestare e avviare il processo IIS (iisreset) e continuare ad avere accesso ai valori per lo stato corrente.

SQL Server modalità

L'opzione SQL Server modalità è simile a quella del servizio Windows NT, ad eccezione del fatto che le informazioni vengono mantenute in SQL Server anziché archiviate in memoria.

Per usare SQL Server come archivio stati sessione, è prima necessario creare le tabelle e le stored procedure necessarie che ASP.NET cercheranno nella SQL Server identificata. .NET SDK fornisce uno script SQL (state.sql) a tale scopo.

state.sql

Il file state.sql contiene i comandi SQL usati per creare il database ASPState. Questo script crea due tabelle e diverse stored procedure. ASP.NET usa sia le tabelle che le procedure per archiviare i dati in SQL Server. È consigliabile leggere tramite state.sql per altre informazioni su ciò che sta facendo.

Il file state.sql è disponibile in [unità di sistema]\winnt\Microsoft.NET\Framework\[versione]\

Applicazione dello script state.sql

Per applicare lo script state.sql, usare lo strumento della riga di comando SQL Server fornisce: osql.exe. Usando un utente SQL equivalente sa, viene usata la sintassi seguente:

osql –S [server name] –U [user] –P [password] <state.sql

Nota: Una versione leggera di SQL Server viene installata quando è installato .NET SDK.

Ecco cosa si dovrebbe vedere:

Figura 2. Uso dello strumento della riga di comando SQL Server per applicare lo script state.sql

Dopo aver eseguito osql, avviare e arrestare SQL Server; parte di quello che state.sql ha aggiunto sono state alcune stored procedure di avvio che devono essere eseguite. Modificare quindi le impostazioni di configurazione per impostare la modalità su sqlserver e modificare sqlconnectionstring per identificare il SQL Server appropriato che gestisce il database ASPState. Ad esempio:

<configuration>
  <sessionstate 
      mode="sqlserver"
      cookieless="false" 
      timeout="20" 
      sqlconnectionstring="data source=MySqlServer;
                           user id=ASPState;
                           password=1Gr8State"
      server="127.0.0.1" 
      port="42424" 
  />
</configuration>

Analogamente alla gestione stato del servizio Windows NT, è ora possibile chiamare SessionState.aspx, impostare un valore dello stato della sessione, arrestare e avviare il processo IIS (iisreset) e continuare ad avere accesso ai valori per lo stato corrente. In effetti, è possibile clusterare i server SQL in modo che, se una SQL Server è stata non disponibile, un altro server che replicava i dati potrebbe verificarsi. Ciò fornisce un livello di affidabilità non disponibile in ASP.

Stato senza cookie

L'ultima nuova funzionalità che è possibile configurare per lo stato della sessione ASP.NET è lo stato della sessione senza cookie. Essenzialmente questa funzionalità consente ai siti i cui client scelgono di non usare i cookie per sfruttare ASP.NET stato della sessione.

Questa operazione viene eseguita modificando l'URL con un ID che identifica in modo univoco la sessione:

https://localhost/(lit3py55t21z5v55vlm25s55)/Application/SessionState.aspx

ASP.NET modificheranno i collegamenti relativi trovati all'interno della pagina e incorporare questo ID. Pertanto, purché l'utente segue il percorso dei collegamenti forniti dal sito, lo stato della sessione può essere mantenuto. Tuttavia, se l'utente finale scrive nuovamente l'URL, l'istanza dello stato della sessione sarà probabilmente persa.

Iis 4.0 Resource Kit ha fornito una funzionalità simile. È stato implementato come filtro ISAPI che potrebbe modificare il flusso di byte in ingresso e in uscita per scrivere e leggere le informazioni necessarie. La differenza tra questa e la funzionalità ASP.NET è lo sforzo necessario per usare la funzionalità. In ASP.NET, è semplicemente una questione di capovolgimento di un valore booleano nel file config.web :

<configuration>
  <sessionstate 
      mode="stateserver"
      cookieless="true" 
      timeout="20" 
      sqlconnectionstring="data source=127.0.0.1;user id=<user id>;password=<password>"
      server="127.0.0.1" 
      port="42424" 
  />
</configuration>

Dopo aver impostato cookieless su true, ASP.NET eseguirà il lavoro necessario per abilitare lo stato della sessione senza cookie. Si noti anche che tutte le modalità sono supportate per le sessioni senza cookie.

Considerazioni sulle prestazioni e sull'affidabilità

Vale la pena menzionare, brevemente, alcuni dei problemi di prestazioni e affidabilità da considerare quando si usano ASP.NET modalità di stato sessione.

  • In fase di elaborazione. Nel processo si eseguirà al meglio perché la memoria dello stato della sessione viene mantenuta all'interno del processo di ASP.NET. Per le applicazioni Web ospitate in un singolo server, le applicazioni in cui l'utente è garantito di essere reindirizzato al server corretto o quando i dati sullo stato della sessione non sono critici (nel senso che possono essere ricompilato o ricompilato), questa è la modalità da scegliere.
  • Fuori processo. Questa modalità viene usata meglio quando le prestazioni sono importanti, ma non è possibile garantire quale server un utente richiederà un'applicazione da. Con la modalità out-of-process, si ottengono le prestazioni di lettura dalla memoria e l'affidabilità di un processo separato che gestisce lo stato per tutti i server.
  • SQL Server. Questa modalità viene usata al meglio quando l'affidabilità dei dati è fondamentale per la stabilità dell'applicazione, poiché il database può essere clusterato per scenari di errore. Le prestazioni non sono veloci quanto più veloci del processo, ma il compromesso è il livello più elevato di affidabilità.

Fattorebilità

Ciò che non abbiamo fatto per coprire in questo articolo, e qualcosa che esamineremo negli articoli futuri, è la fattoribilità di ASP.NET. Essenzialmente, questa è la possibilità di estendere o sostituire le funzionalità ASP.NET, ad esempio lo stato della sessione. Se una terza parte fornisce una gestione stato sessione estesa che archivia i dati della sessione in una directory LDAP (Lightweight Directory Access Protocol), ad esempio una directory LDAP di Netscape, l'implementazione predefinita dello stato della sessione ASP.NET può essere sostituita.

Riepilogo

Come si può notare, ASP.NET stato sessione è molto diverso dallo stato della sessione ASP. La nuova funzionalità dello stato della sessione non associata al processo di ASP.NET significa che gli sviluppatori possono iniziare a usare lo stato della sessione negli ambienti della server farm senza preoccuparsi del fatto che il client venga attraverso un server proxy. Inoltre, con la funzionalità dello stato senza cookie, è ancora più semplice usare lo stato della sessione e garantire che tutti i client possano sfruttare la funzionalità dello stato della sessione.

Nell'articolo successivo verrà esaminata la nuova funzionalità di traccia in ASP.NET.

Rob Howard è un responsabile del programma per ASP.NET nel team di .NET Frameworks. Passa tutto il tempo libero che ha con la sua famiglia o vola pesca a Washington orientale.