Condividi tramite


Provider dell'archivio dello stato sessione di esempio

Aggiornamento: novembre 2007

Viene fornita la descrizione dell'implementazione di un provider dell'archivio dello stato sessione personalizzato che utilizza il provider di dati .NET Framework per ODBC per gestire le informazioni sulla sessione in un database Access.

Negli argomenti riportati di seguito viene fornito il codice relativo all'implementazione di un provider dell'archivio dello stato sessione di esempio. Il provider utilizza le classi System.Data.Odbc per archiviare e recuperare informazioni sulla sessione tramite un database Access.

In questo argomento vengono illustrati i dettagli di implementazione relativi al provider dell'archivio dello stato sessione di esempio e viene descritto come compilare l'esempio e configurare un'applicazione ASP.NET per l'utilizzo del provider di esempio.

Il codice relativo al provider di esempio è disponibile in Procedura: implementare un provider dell'archivio dello stato sessione di esempio.

Schema del database

Il provider dello stato sessione di esempio utilizza una singola tabella denominata Sessions per gestire le informazioni sulla sessione. Per creare la tabella Access utilizzata dal provider di esempio, eseguire la seguente query di definizione dei dati in un nuovo database Access o in uno esistente.

CREATE TABLE Sessions
(
  SessionId       Text(80)  NOT NULL,
  ApplicationName Text(255) NOT NULL,
  Created         DateTime  NOT NULL,
  Expires         DateTime  NOT NULL,
  LockDate        DateTime  NOT NULL,
  LockId          Integer   NOT NULL,
  Timeout         Integer   NOT NULL,
  Locked          YesNo     NOT NULL,
  SessionItems    Memo,
  Flags           Integer   NOT NULL,
    CONSTRAINT PKSessions PRIMARY KEY (SessionId, ApplicationName)
)

Accesso al log eventi

Se durante l'utilizzo dell'origine dati il provider di esempio rileva un'eccezione, anziché restituirla all'applicazione ASP.NET scrive i relativi dettagli nel log eventi dell'applicazione. Si tratta di una misura di sicurezza per impedire che nell'applicazione ASP.NET vengano esposte informazioni private relative all'origine dati.

Il provider di esempio specifica "OdbcSessionStateStore" come valore della proprietà Source degli eventi. Affinché l'applicazione ASP.NET possa scrivere correttamente nel log eventi dell'applicazione è necessario creare la seguente chiave del Registro di sistema.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application\OdbcSessionStateStore

Se non si desidera che il provider di esempio scriva le eccezioni nel log eventi, è possibile impostare l'attributo writeExceptionsToEventLog personalizzato su false nel file Web.config.

Supporto per l'evento Session_OnEnd

Il provider dell'archivio dello stato sessione di esempio non supporta l'evento Session_OnEnd definito nel file Global.asax perché il database Access non è in grado di segnalare al provider che la data e l'ora di scadenza di una sessione sono state superate. Per ottenere queste informazioni, il provider dell'archivio dello stato sessione deve eseguire una query. Non è possibile prevedere quando il provider verrà utilizzato ed è pertanto improbabile che l'evento Session_OnEnd venga generato esattamente allo scadere della sessione. Di conseguenza, l'implementazione del metodo SetItemExpireCallback nel provider dell'archivio dello stato sessione di esempio restituisce false per informare SessionStateModule che l'evento Session_OnEnd non è supportato.

Cancellazione dei dati relativi a sessioni scadute

Poiché il provider dell'archivio dello stato sessione di esempio non supporta l'evento Session_OnEnd, non cancella automaticamente i dati relativi alle sessioni scadute. Si consiglia di eliminare periodicamente queste informazioni dall'archivio dati utilizzando il seguente codice.

Dim commandString As String = "DELETE FROM Sessions WHERE Expires < ?"
Dim conn As OdbcConnection = new OdbcConnection(connectionString)
Dim cmd As OdbcCommand = New OdbcCommand(commandString, conn)
cmd.Parameters.Add("@Expires", OdbcType.DateTime).Value = DateTime.Now
conn.Open()
cmd.ExecuteNonQuery()
conn.Close()
string commandString = "DELETE FROM Sessions WHERE Expires < ?";
OdbcConnection conn = new OdbcConnection(connectionString);
OdbcCommand cmd = new OdbcCommand(commandString, conn);
cmd.Parameters.Add("@Expires", OdbcType.DateTime).Value = DateTime.Now;
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();

Compilazione del provider di esempio

Per poter utilizzare il provider di esempio, è necessario inserire il codice sorgente nella directory App_Code dell'applicazione. Se nella directory App_Code dell'applicazione esiste già del codice sorgente, è necessario aggiungere la versione del provider di esempio scritta nello stesso linguaggio del codice esistente nella directory. Quando verrà richiesta l'applicazione, il provider verrà compilato da ASP.NET.

In alternativa, è possibile compilare il provider di esempio come libreria e inserirlo nella directory Bin dell'applicazione Web oppure assegnare un nome sicuro al provider e inserirlo nella Global Assembly Cache (GAC). Il seguente comando mostra come compilare il provider di esempio mediante il compilatore della riga di comando dopo che il codice di esempio è stato copiato in un file denominato OdbcSessionStateStore.vb per Visual Basic e OdbcSessionStateStore.cs per C#.

vbc /out:OdbcSessionStateStore.dll /t:library OdbcSessionStateStore.vb /r:System.Web.dll /r:System.Configuration.dll
csc /out:OdbcSessionStateStore.dll /t:library OdbcSessionStateStore.cs /r:System.Web.dll /r:System.Configuration.dll

Utilizzo del provider di esempio in un'applicazione ASP.NET

Nell'esempio riportato di seguito viene illustrato il file Web.config per un'applicazione ASP.NET configurata per l'utilizzo del provider di esempio. Nell'esempio viene utilizzato il nome origine dati ODBC "SessionState" per ottenere le informazioni di connessione relative al database Access. Per utilizzare il provider di esempio, sarà necessario creare il nome origine dati di sistema "SessionState" oppure fornire una stringa di connessione ODBC valida per il database.

Nella configurazione di esempio si presuppone che il sito Web sia impostato in modo da utilizzare l'autenticazione basata su form e includa una pagina ASP.NET denominata login.aspx che consente agli utenti di eseguire l'accesso.

<configuration>
  <connectionStrings>
    <add name="OdbcSessionServices" connectionString="DSN=SessionState;" />
  </connectionStrings>

  <system.web>
    <sessionState 
      cookieless="true"
      regenerateExpiredSessionId="true"
      mode="Custom"
      customProvider="OdbcSessionProvider">
      <providers>
        <add name="OdbcSessionProvider"
          type="Samples.AspNet.Session.OdbcSessionStateStore"
          connectionStringName="OdbcSessionServices"
          writeExceptionsToEventLog="false" />
      </providers>
    </sessionState>
  </system.web>
</configuration>

Vedere anche

Concetti

Implementazione di un provider dell'archivio dello stato sessione

Cenni preliminare sullo stato della sessione ASP.NET

Cenni preliminari sulla gestione dello stato ASP.NET