Exemple de fournisseur de magasins d'état de session

Mise à jour : novembre 2007

Décrit une implémentation de fournisseur de magasins d'état de session personnalisée qui utilise le fournisseur de données .NET Framework pour ODBC pour gérer des informations de session dans une base de données Access.

Les rubriques suivantes incluent le code d'un exemple d'implémentation de fournisseur de magasins d'état de session. L'exemple de fournisseur utilise les classes System.Data.Odbc pour stocker et récupérer des informations sur la session à l'aide d'une base de données Access.

Cette rubrique donne des détails sur l'implémentation de l'exemple de fournisseur de magasins d'état de session et indique comment générer cet exemple et configurer une application ASP.NET pour l'utiliser.

Le code de l'exemple de fournisseur est fourni à la rubrique Comment : échantillonner un fournisseur de magasins d'état de session.

Schéma de base de données

L'exemple de fournisseur d'états de session utilise une seule table nommée Sessions pour gérer des informations sur la session. Pour créer la table Access utilisée par l'exemple de fournisseur, émettez la requête de définition de données suivante dans une base de données Access nouvelle ou existante.

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)
)

Accès au journal des événements

Si l'exemple de fournisseur rencontre une exception lorsqu'il travaille avec la source de données, il écrit les détails de l'exception dans le journal des événements de l'application plutôt que de retourner l'exception à l'application ASP.NET. Cette opération est exécutée comme une mesure de sécurité visant à éviter l'exposition des informations privées relatives à la source de données dans l'application ASP.NET.

L'exemple de fournisseur spécifie une valeur de propriété Source d'événement "OdbcSessionStateStore". Avant que votre application ASP.NET ne puisse écrire correctement dans le journal des événements de l'application, vous devez créer la clé de Registre suivante :

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

Si vous ne souhaitez pas que l'exemple de fournisseur écrive des exceptions dans le journal des événements, vous pouvez affecter à l'attribut writeExceptionsToEventLog personnalisé la valeur false dans le fichier Web.config.

Prise en charge de l'événement Session_OnEnd

L'exemple de fournisseur de magasins d'état de session ne prend pas en charge l'événement Session_OnEnd défini dans le fichier Global.asax, car la base de données Access n'a aucun moyen d'avertir le fournisseur de magasins d'état de session que la date et l'heure d'expiration d'une session sont passées. Le fournisseur de magasins d'état de session doit demander ces informations. Vous ne pouvez pas prévoir la date à laquelle le fournisseur de magasins d'état de session sera utilisé ; par conséquent, il est peu probable que l'événement Session_OnEnd sera déclenché au moment précis de l'expiration de la session. L'implémentation de la méthode SetItemExpireCallback dans l'exemple de fournisseur de magasins d'état de session retourne donc la valeur false, pour informer SessionStateModule que l'événement Session_OnEnd n'est pas pris en charge.

Nettoyage des données de sessions expirées

Étant donné que l'exemple de fournisseur de magasins d'état de session ne fournit pas de prise en charge de l'événement Session_OnEnd, les données d'éléments de sessions expirées ne sont pas nettoyées automatiquement. Il est recommandé de supprimer régulièrement les informations de sessions expirées du magasin de données à l'aide du code suivant.

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();

Génération de l'exemple de fournisseur

Pour utiliser l'exemple de fournisseur, vous pouvez placer votre code source dans le répertoire App_Code de votre application. Notez que, si vous avez déjà le code source dans le répertoire App_Code de votre application, vous devez ajouter la version de l'exemple de fournisseur qui est écrite dans le même langage que le code existant dans le répertoire. Le fournisseur sera compilé par ASP.NET lorsque votre application sera demandée.

Vous pouvez aussi compiler l'exemple de fournisseur en tant que bibliothèque et le placer dans le répertoire Bin de votre application Web, ou lui affecter un nom fort et le placer dans le GAC. La commande suivante montre comment compiler l'exemple de fournisseur à l'aide du compilateur de ligne de commande après que l'exemple de code a été copié dans un fichier nommé OdbcSessionStateStore.vb pour Visual Basic et OdbcSessionStateStore.cs pour 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

Utilisation de l'exemple de fournisseur dans une application ASP.NET

L'exemple suivant montre le fichier Web.config pour une application ASP.NET configurée pour utiliser l'exemple de fournisseur. L'exemple utilise un DSN ODBC nommé "SessionState" pour obtenir des informations de connexion pour la base de données Access. Pour utiliser l'exemple de fournisseur, vous devez créer le DSN système "SessionState" ou fournir une chaîne de connexion ODBC valide à votre base de données.

L'exemple de configuration suppose que votre site Web est configuré pour utiliser l'authentification par formulaire et comprend une page ASP.NET nommée login.aspx qui permet aux utilisateurs de se connecter.

<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>

Voir aussi

Concepts

Implémentation d'un fournisseur de magasins d'état de session

Vue d'ensemble de l'état de session ASP.NET

Vue d'ensemble de la gestion d'état ASP.NET