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