Beispiel für einen Sitzungszustandsspeicher-Anbieter

Aktualisiert: November 2007

Beschreibt die benutzerdefinierte Implementierung eines Sitzungszustandsspeicher-Anbieters, der den .NET Framework-Datenanbieter für ODBC verwendet, um die Sitzungsinformationen in einer Access-Datenbank zu verwalten.

Die folgenden Themen enthalten den Code für die Implementierung eines Beispielanbieters für Sitzungszustandsspeicher. Der Beispielanbieter verwendet die System.Data.Odbc-Klassen, um die Sitzungsinformationen in einer Access-Datenbank zu speichern und sie daraus abzurufen.

In diesem Thema werden Einzelheiten zur Implementierung eines Beispielanbieters für Sitzungszustandsspeicher erläutert, und es wird beschrieben, wie Sie das Beispiel erstellen und eine ASP.NET-Anwendung für die Verwendung des Beispielanbieters konfigurieren.

Den Code für den Beispielanbieter finden Sie unter Gewusst wie: Beispiel eines Sitzungszustandsspeicher-Anbieters.

Datenbankschema

Der Beispielsitzungszustandsanbieter verwendet für die Verwaltung der Sitzungsinformationen lediglich die Tabelle Sessions. Führen Sie zum Erstellen der Access-Tabelle für den Beispielanbieter die folgende Datendefinitionsabfrage in einer neuen oder bestehenden Access-Datenbank aus.

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

Zugriff auf das Ereignisprotokoll

Wenn der Beispielanbieter beim Zugreifen auf die Datenquelle eine Ausnahme ermittelt, werden die Einzelheiten der Ausnahme nicht an die ASP.NET-Anwendung zurückgegeben, sondern in das Ereignisprotokoll der Anwendung geschrieben. Hierbei handelt es sich um eine Sicherheitsmaßnahme, die verhindern soll, dass vertrauliche Informationen über die Datenquelle für die ASP.NET-Anwendung zugänglich sind.

Der Beispielanbieter gibt für die Source-Ereigniseigenschaft als Ereignisquelle den Wert "OdbcSessionStateStore" an. Damit eine ASP.NET-Anwendung erfolgreich in das Ereignisprotokoll der Anwendung schreiben kann, müssen Sie den folgenden Registrierungsschlüssel erstellen:

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

Wenn Sie nicht möchten, dass der Beispielanbieter Ausnahmen in das Ereignisprotokoll schreibt, können Sie in der Datei Web.config das benutzerdefinierte writeExceptionsToEventLog-Attribut auf false festlegen.

Unterstützung für das Session_OnEnd-Ereignis

Der Beispielanbieter für Sitzungszustandsspeicher unterstützt das in der Datei Global.asax definierte Session_OnEnd-Ereignis nicht, denn es gibt für die Access-Datenbank keine Möglichkeit, dem Sitzungszustandsspeicher-Anbieter mitzuteilen, dass Ablaufdatum und -zeit der Sitzung verstrichen sind. Der Anbieter muss diese Informationen abfragen. Im Voraus lässt nicht sagen, wann der Sitzungszustandsspeicher-Anbieter zum Einsatz kommt. Daher ist es unwahrscheinlich, dass das Session_OnEnd-Ereignis genau dann ausgelöst wird, wenn die Sitzung abläuft. Als Ergebnis gibt die Implementierung der SetItemExpireCallback-Methode im Anbieter für den Sitzungszustandsspeicher false zurück. Damit wird der SessionStateModule-Klasse signalisiert, dass das Session_OnEnd-Ereignis nicht unterstützt wird.

Löschen der Daten von abgelaufenen Sitzungen

Da der Anbieter für den Sitzungszustandsspeicher das Session_OnEnd-Ereignis nicht unterstützt, werden die Daten von abgelaufenen Sitzungen nicht automatisch gelöscht. Es ist empfehlenswert, in regelmäßigen Abständen die Daten von abgelaufenen Sitzungen aus dem Datenspeicher löschen. Verwenden Sie dazu folgenden Code:

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

Erstellen des Beispielanbieters

Um den Beispielanbieter zu verwenden, fügen Sie den Quellcode in das Verzeichnis App_Code der Anwendung ein. Wenn sich bereits Quellcode im Verzeichnis App_Code der Anwendung befindet, müssen Sie die Version des Beispielanbieters hinzufügen, die in der gleichen Sprache wie der vorhandene Code im Verzeichnis geschrieben ist. Der Anbieter wird von ASP.NET kompiliert, wenn die Anwendung angefordert wird.

Sie können auch den Beispielanbieter als Bibliothek kompilieren und ins Verzeichnis Bin Ihrer Webanwendung einfügen bzw. ihn stark benennen und in den globalen Zugriffscache einfügen. Der folgende Befehl zeigt, wie Sie den Beispielanbieter mit dem Befehlszeilencompiler kompilieren können, nachdem Sie den Beispielcode in die Datei OdbcSessionStateStore.vb (für Visual Basic) bzw. OdbcSessionStateStore.cs (für C#) kopiert haben.

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

Verwenden des Beispielanbieters in einer ASP.NET-Anwendung

Das folgende Beispiel zeigt die Datei Web.config einer ASP.NET-Anwendung, die für die Verwendung des Beispielanbieters konfiguriert ist. Im Beispiel wird eine ODBC-DSN mit dem Namen "SessionState" zum Ermitteln der Verbindungsinformationen für die Access-Datenbank verwendet. Zum Verwenden des Beispielanbieters müssen Sie entweder die System-DSN "SessionState" erstellen oder eine gültige ODBC-Verbindungszeichenfolge für Ihre Datenbank angeben.

Diese Beispielkonfiguration setzt voraus, dass Ihre Website die Formularauthentifizierung unterstützt und zusätzlich über eine ASP.NET-Seite mit dem Namen login.aspx verfügt, über die sich die Benutzer anmelden können.

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

Siehe auch

Konzepte

Implementieren eines Sitzungszustandsspeicher-Anbieters

Übersicht über den ASP.NET-Sitzungszustand

Übersicht über die ASP.NET-Zustandsverwaltung