Verständnis des asp.net-Sitzungsstatus
Autor:Eve Cole
Aktualisierungszeit:2009-07-01 16:44:49
1. Funktionen des Sitzungsstatus
HTTP ist ein zustandsloses Protokoll und zeigt daher nicht automatisch an, ob eine Reihe von Anfragen alle von demselben Client stammen oder ob eine einzelne Browserinstanz noch aktiv eine Seite oder Site anzeigt. Und mit der integrierten Sitzungsstatusfunktion von ASP.net können wir verwenden
1. Identifizieren und klassifizieren Sie automatisch Anfragen von einem einzelnen Browser-Client an eine logische Anwendungssitzung auf dem Server.
2. Speichern Sie sitzungsbezogene Daten auf dem Server, um sie über mehrere Browseranfragen hinweg zu verwenden.
3. Lösen Sie geeignete Verwaltungsereignisse für die Sitzungslebensdauer aus (Session_OnStart, Session_OnEnd usw.), die im Anwendungscode verarbeitet werden können
2. Identifizierung des Sitzungsstatus
Beim Erstellen einer Sitzung generiert der Server für jede Sitzung eine separate ID. Der Bezeichner wird durch eine 120-Bit-SessionID-Zeichenfolge dargestellt, die nur die in der URL zulässigen ASCII-Zeichen enthält. Der SessionID-Wert wird mithilfe eines Algorithmus generiert, der Einzigartigkeit und Zufälligkeit garantiert. Der Zweck der Garantie der Einzigartigkeit besteht darin, sicherzustellen, dass keine Sitzungen in Konflikt geraten, und der Zweck der Garantie der Zufälligkeit besteht darin, sicherzustellen, dass böswillige Benutzer keine neuen SessionIDs verwenden können, um die Anzahl vorhandener Sitzungen zu berechnen Sitzungen. Sitzungs-ID.
3. So speichern Sie den Sitzungsstatus
Es gibt drei Möglichkeiten, den Sitzungsstatus zu speichern:
1. In-Process-Sitzungsstatusmodus (Inproc): Wenn wir ein neues Webprogramm erstellen, wird standardmäßig der In-Process-Sitzungsstatusmodus übernommen. Dies ist auch der von allen häufig verwendete Modus. In diesem Modus wird der Sitzungsstatus lokal im ASP.NET-Workerprozess gespeichert, sodass der In-Process-Sitzungsstatusmodus wahrscheinlich die schnellste Zugriffsoption ist. Doch je mehr Daten in einer Sitzung gespeichert werden, desto mehr Speicher verbraucht der Webserver, was möglicherweise das Risiko einer Leistungseinbuße erhöht.
2. .NET-Statusservermodus (StateServer): Der Sitzungsstatus wird im Remote-Prozess gespeichert (z. B. im Windows NT-Dienst namens aspnet_state.exe).
3. SQL-Modus (SQLServer): Der Sitzungsstatus wird in einer dedizierten Datenbanktabelle gespeichert, die von SQL Server verwaltet wird.
Sowohl der .NET-Statusservermodus als auch der SQL-Modus können als Out-of-Process-Sitzungsmodus bezeichnet werden. Beim Speichern von Daten müssen die Daten serialisiert und in einem externen Repository gespeichert werden. Beim Lesen von Daten müssen die Daten deserialisiert und kopiert werden zum lokalen Sitzungswörterbuch, sodass die Anforderung zu einer Leistungseinbuße von 15 % (außerhalb des Prozesses) bis 25 % (SQL Server) führte. Beachten Sie, dass dies nur eine grobe Schätzung ist. Im Out-of-Process-Storage-Szenario bleibt der Sitzungsstatus jedoch länger erhalten, wodurch die Anwendung leistungsfähiger wird, da sie vor Ausfällen von Microsoft® Internet Information Services (IIS) und ASP.NET schützt. Durch die Trennung des Sitzungsstatus von Anwendungen können Sie vorhandene Anwendungen auch einfacher auf Web Farm- und Web Garden-Architekturen erweitern. Darüber hinaus wird der Sitzungsstatus in einem externen Prozess gespeichert, wodurch das Risiko eines periodischen Datenverlusts aufgrund von Prozessschleifen im Wesentlichen ausgeschlossen wird.
4. Konfiguration des Sitzungsstatus
Die Konfiguration des Sitzungsstatus wird durch Festlegen des Abschnitts der Datei Web.config erreicht. Im Folgenden werden die spezifischen Konfigurationsmethoden der drei Sitzungszustände vorgestellt.
1. In-Process-Modus
Der In-Process-Modus ist der standardmäßige Sitzungsstatusmodus. Um den In-Process-Modus zu verwenden, legen Sie das mode-Attribut des -Elements auf Inproc fest.
Eine Beispielkonfigurationseinstellung für den In-Process-Modus ist unten dargestellt. http://www.downcodes.com
<Konfiguration>
<sessionState mode="Inproc"
cookieless="false"
Zeitüberschreitung="20"/>
</sessionState>
</system.web>
</Konfiguration>
2. State-Server-Modus
Um einen Statusserver zu verwenden, müssen Sie zunächst sicherstellen, dass der ASP.NET-Statusdienst auf dem Remoteserver ausgeführt wird, der für die Sitzungsspeicherung verwendet wird. Dieser Dienst wird mit ASP.NET und Visual Studio .NET installiert unter:
systemrootMicrosoft.NETFrameworkversionNumberaspnet_state.exe
Legen Sie dann in der Web.config-Datei der Anwendung das Modusattribut des Elements auf StateServer fest. Legen Sie abschließend die Eigenschaft „connectionString“ auf „tcpip=serverName:portNumber“ fest.
Im Folgenden finden Sie ein Beispiel für Konfigurationseinstellungen für den Statusservermodus.
<Konfiguration>
<sessionState mode="StateServer"
stateConnectionString="tcpip=dataserver:42424"
cookieless="false"
Zeitüberschreitung="20"/>
</sessionState>
</system.web>
3. SQL Server-Modus
Um SQL Server zu verwenden, führen Sie zunächst InstallSqlState.sql oder InstallPersistSqlState.sql auf dem SQL Server-Computer aus, auf dem der Sitzungsstatus gespeichert wird. Beide Skripte erstellen eine Datenbank namens ASPState, die mehrere gespeicherte Prozeduren enthält.
Der Unterschied zwischen den beiden Skripten besteht darin, wo die Tabellen ASPStateTempApplications und ASPStateTempSessions platziert werden. Das Skript „InstallSqlState.sql“ fügt diese Tabellen zur TempDB-Datenbank hinzu, wodurch beim Neustart des Computers Daten verloren gehen. Stattdessen fügt das Skript „InstallPersistSqlState.sql“ diese Tabellen der ASPState-Datenbank hinzu, wodurch Sitzungsdaten über Computerneustarts hinweg beibehalten werden können.
Standardmäßig werden beide Skriptdateien am folgenden Speicherort installiert:
systemrootMicrosoft.NETFrameworkversionNumber
Legen Sie dann in der Web.config-Datei der Anwendung das Modusattribut des Elements auf SQLServer fest. Legen Sie abschließend die Eigenschaft „sqlConnectionString“ auf „Integrated Security=SSPI;data source=serverName;“ fest.
Eine Beispielkonfigurationseinstellung für den SQL Server-Modus ist unten dargestellt.
<Konfiguration>
<sessionState mode="SQLServer"
sqlConnectionString="Integrated Security=SSPI;data source=dataserver;"
cookieless="false"
Zeitüberschreitung="20"/>
</sessionState>
</system.web>
</Konfiguration>
Im SQL Server-Modus kann der Sitzungsstatus auch so konfiguriert werden, dass er in einem Failover-Cluster funktioniert. Ein Failover-Cluster besteht aus zwei oder mehr identischen redundanten Webservern, die Sitzungsdaten in einer SQL Server-Datenbank auf einem separaten Computer speichern. Fällt ein Webserver aus, übernimmt ein anderer Server im Cluster dessen Arbeit und bedient Anfragen ohne Verlust von Sitzungsdaten.
Um das Failover-Clustering zu konfigurieren, legen Sie das Element in der Web.config-Datei des Webservers auf denselben Wert fest.
Legen Sie dann die SQL-Verbindungszeichenfolge des Webservers so fest, dass sie auf die SQL Server-Datenbank auf Ihrem Computer verweist, in der die Sitzungsdaten gespeichert sind.
5. Zugriff auf den Sitzungsstatus
Sie können direkt über die Sitzungssammlung auf den Sitzungsstatus zugreifen. Aus Kompatibilitätsgründen mit früheren ASP-Versionen kann der Zugriff auf den Sitzungsstatus auch über die Session.Contents-Eigenschaft des Anwendungsobjekts erreicht werden.
Das folgende Beispiel zeigt das Schreiben von zwei Werten in die Session-Sammlung auf der ersten Webseite und das anschließende Lesen der Session-Sammlung auf der zweiten Webseite. Hinweis: Seitencodes werden hier weggelassen.
Die erste Webseite schreibt den Wert in die Session-Sammlung
dim name as string = „a“
Dim-ID als Ganzzahl = „1“
session("name") = Name
session("id") = id
Die zweite Webseite erhält den Wert aus der Session-Sammlung
dim name as string = session("name")
dim id as integer = session("id")
'Ermitteln Sie die Anzahl der Elemente in der Sitzungsstatussammlung
dim i als integer = session.count
Beachten Sie, dass im In-Process-Modus keine echte Serialisierung und Deserialisierung stattfindet, sodass die Objekte im Sitzungsstatus als aktive Instanzen ihrer jeweiligen Klassen gespeichert werden.
Da im Out-of-Process-Sitzungsmodus Serialisierung und Deserialisierung verwendet werden, müssen Sie den Datentyp entsprechend der Situation konvertieren.
Wenn Sie einen Datumswert serialisieren, sollte das Datum vom Typ Int64 sein.
6. Ereignisse zur Verwaltung der Sitzungslebensdauer
Es gibt zwei Sitzungslebensdauer-Verwaltungsereignisse: Session_OnStart-Ereignis und Session_OnEnd-Ereignis. Sie können sie in der Datei Global.asax.VB festlegen.
1. Session_OnStart-Ereignis
Wenn ein einzelner Browser-Client eine Verbindung zum Server herstellt, wird das Ereignis „Session_OnStart“ ausgelöst, das den Beginn der Sitzung markiert. Dieses Ereignis wird beim nachfolgenden Surfen nicht mehr ausgelöst, es sei denn, die Sitzung läuft ab oder wird abgebrochen. Das Session_OnStart-Ereignis ist der beste Zeitpunkt zum Festlegen von Sitzungsvariablen, da diese vor dem Zugriff auf eine Seite festgelegt werden.
Beispiel: Das folgende Beispiel ist ein häufig verwendeter Session_OnStart-Ereigniscode zum Zählen der Anzahl der Personen, die online sind:
Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs)
„Wenn ein Ereignis eintritt, addieren Sie 1 zur Anzahl der Online-Benutzer.“
Anwendung("usercount") = Anwendung("usercount") + 1
Sub beenden
2. Session_OnEnd-Ereignis
Das Session_OnEnd-Ereignis tritt auf, wenn eine Sitzung abgebrochen wird oder eine Zeitüberschreitung auftritt, und markiert das Ende des Ereignisses. Bitte beachten Sie jedoch, dass dieses Ereignis nur im InProc-Modus unterstützt wird. Sie können den Timeout-Zeitraum über das Timeout-Attribut des Abschnitts der Web.config-Datei angeben. Wenn sich der Benutzer innerhalb des Timeout-Zeitraums befindet (in Minuten, beträgt der Standardwert 20 Minuten).
Uhr), ohne die Webseite zu aktualisieren oder anzufordern, wird die Sitzung beendet. Sie können das Session_OnEnd-Ereignis verwenden, um einige Aufräumarbeiten durchzuführen.
Beispiel: Das folgende Beispiel ist ein häufig verwendeter Session_OnEnd-Ereigniscode zum Zählen der Anzahl der Personen, die online sind:
Sub Session_End(ByVal sender As Object, ByVal e As EventArgs)
Anwendung("usercount") = Anwendung("usercount") - 1
Sub beenden