ASP.NET Sitzungszustand
Rob Howard
Microsoft Corporation
28. Dezember 2000
Hinweis Der Code in diesem Artikel richtet sich an die Betaversion von Microsoft .NET. Ein Teil des Codes erfordert möglicherweise eine Neubearbeitung, um in späteren Versionen des .NET Framework ordnungsgemäß zu funktionieren.
In der Spalte dieses Monats nehmen wir das Tempo ein bisschen auf und tauchen direkt in einige der neuen Features von ASP.NET ein. Wir beginnen mit dem Vergleich ASP.NET Sitzungszustands mit klassischem ASP, und zeigen Dann Code und Beispiele für die Konfiguration und Verwendung ASP.NET Sitzungsstatus an.
Eine Sitzung wird als Zeitraum definiert, in dem ein eindeutiger Benutzer mit einer Webanwendung interagiert. Active Server Pages (ASP) Entwickler, die Daten für eindeutige Benutzersitzungen aufbewahren möchten, können ein systeminternes Feature verwenden, das als Sitzungszustand bezeichnet wird.
Programmgesteuert ist der Sitzungszustand nichts mehr als Arbeitsspeicher in Form einer Wörterbuch- oder Hashtabelle, z. B. Schlüsselwertpaare, die für die Dauer der Sitzung eines Benutzers festgelegt und gelesen werden können. Ein Benutzer wählt beispielsweise Aktien aus, die nachverfolgt werden sollen, und die Webanwendung kann diese Werte in der ASP-Sitzungsinstanz des Benutzers speichern:
Session("Stocks") = "MSFT; VRSN; GE"
Auf nachfolgenden Seiten werden diese Werte gelesen, und die Webanwendung hat Zugriff auf diese Werte, ohne dass der Benutzer sie erneut eingeben muss:
' Get Stocks, split string, etc.
Dim StockString
StockString = Session("Stocks")
ASP verwaltet den Sitzungszustand, indem der Client einen eindeutigen Schlüssel bereitstellt, der dem Benutzer zugewiesen ist, wenn die Sitzung beginnt. Dieser Schlüssel wird in einem HTTP-Cookie gespeichert, das der Client auf jeder Anforderung an den Server sendet. Der Server kann dann den Schlüssel aus dem Cookie lesen und den Serversitzungszustand erneut aufblasen.
Probleme mit dem ASP-Sitzungsstatus
ASP-Entwickler kennen den Sitzungszustand als großartiges Feature, aber eine, die etwas eingeschränkt ist. Dazu gehören die folgenden Einschränkungen:
- Prozess abhängig. DER ASP-Sitzungsstatus ist im Prozess vorhanden, der ASP hostet; die Aktionen, die sich auf den Prozess auswirken, wirken sich daher auch auf den Sitzungszustand aus. Wenn der Prozess wiederverwendet oder fehlschlägt, geht der Sitzungszustand verloren.
- Einschränkungen der Serverfarm. Wenn Benutzer von Server zu Server in einer Webserverfarm wechseln, folgt ihr Sitzungsstatus nicht. DER ASP-Sitzungszustand ist computerspezifisch. Jeder ASP-Server stellt seinen eigenen Sitzungszustand bereit, und es sei denn, der Benutzer kehrt zumselben Server zurück, der Sitzungszustand ist nicht zugänglich. Während Routinglösungen auf Netzwerk-IP-Ebene solche Probleme lösen können, indem sichergestellt wird, dass Client-IPs an den ursprünglichen Server weitergeleitet werden, wählen einige ISPs die Verwendung einer Proxy-Lastenausgleichslösung für ihre Clients aus. Die meisten berüchtigten davon sind AOL. Lösungen wie AOL verhindern das Routing von Anforderungen auf Netzwerkebene an Server, da die IP-Adressen für den Requestor nicht eindeutig sein können.
- Cookie abhängig. Clients, die HTTP-Cookies nicht akzeptieren, können den Sitzungszustand nicht nutzen. Einige Clients glauben, dass Cookies Sicherheit und/oder Datenschutz kompromittieren und sie somit deaktivieren, wodurch der Sitzungszustand auf dem Server deaktiviert wird.
Dies sind einige der Problemsätze, die im Entwurf ASP.NET Sitzungszustands berücksichtigt wurden.
ASP.NET Sitzungszustand
ASP.NET Sitzungszustand löst alle oben genannten Probleme, die dem klassischen ASP-Sitzungszustand zugeordnet sind:
- Prozessunabhängig. ASP.NET Sitzungsstatus kann in einem separaten Prozess vom ASP.NET Hostprozess ausgeführt werden. Wenn sich der Sitzungszustand in einem separaten Prozess befindet, kann der ASP.NET Prozess kommen und gehen, während der Sitzungsstatusprozess weiterhin verfügbar ist. Natürlich können Sie auch den Sitzungszustand weiterhin ähnlich wie klassische ASP verwenden.
- Unterstützung für Serverfarmkonfigurationen. Durch den Wechsel zu einem Out-of-Process-Modell löst ASP.NET auch das Serverfarmproblem. Mit dem neuen Out-of-Process-Modell können alle Server in der Farm einen Sitzungsstatusprozess freigeben. Sie können dies implementieren, indem Sie die ASP.NET-Konfiguration so ändern, dass sie auf einen gemeinsamen Server verweist.
- Cookie unabhängig. Obwohl Lösungen für das Problem der cookielosen Zustandsverwaltung für klassische ASP vorhanden sind, sind sie nicht trivial zu implementieren. ASP.NET reduziert dagegen die Komplexität des cookielosen Sitzungszustands auf eine einfache Konfigurationseinstellung.
Sehen wir uns die einzelnen Features genauer an, einschließlich der Konfiguration der Einstellungen.
Verwenden ASP.NET Sitzungsstatus
Sitzungsstatuseinstellungen in ASP.NET werden über die ASP.NET XML-Konfigurationsdatei config.web konfiguriert. Wir sehen uns config.web genauer in einer späteren Spalte an, aber für diese Diskussion des Sitzungszustands betrachten wir es kurz.
Config.web
Es gibt zwei Arten von Konfigurationsdateien: eine Computerkonfigurationsdatei und eine Anwendungskonfigurationsdatei mit dem Namen config.web. Die beiden sind identisch, außer dass die Computerkonfigurationsdatei Einstellungen auf alle Anwendungen anwendet, aber die Anwendungskonfigurationsdateien sind entweder restriktiv oder erweiterbar auf Anwendungs-by-Application-Basis.
In Beta 1 befindet sich die Datei "machine config.web " im Verzeichnis " WinNT\Microsoft.NET\Framework\v1.0.2204 ", während die optionalen Anwendungskonfigurationsdateien im Verzeichnis der Anwendung vorhanden sind. Application config.web files are optional in the sense that if an application config.web file t exist, the machine config.web settings are used instead. ASP.NET Einstellungen für den Sitzungszustand können in der Datei "machine config.web" vorgenommen und in der Datei "config.web" einer bestimmten Anwendung außer Kraft gesetzt werden.
Hinweis: Änderungen, die an config.web vorgenommen wurden, werden sofort angewendet, im Gegensatz zu klassischem ASP, wo der Server beendet und gestartet werden muss, damit sich die Einstellungen auswirken.
Sitzungskonfiguration
Nachfolgend finden Sie eine Beispieldatei config.web, die zum Konfigurieren der Sitzungsstatuseinstellungen für eine ASP.NET Anwendung verwendet wird:
<configuration>
<sessionstate
mode="inproc"
cookieless="false"
timeout="20"
sqlconnectionstring="data source=127.0.0.1;user id=<user id>;password=<password>"
server="127.0.0.1"
port="42424"
/>
</configuration>
Die obigen Einstellungen werden verwendet, um ASP.NET Sitzungszustand zu konfigurieren. Sehen wir uns die einzelnen genauer an und decken die verschiedenen Verwendungen danach ab.
- Mode. Die Moduseinstellung unterstützt drei Optionen: inproc, sqlserver und stateserver. Wie bereits erwähnt, unterstützt ASP.NET zwei Modi: im Prozess und außerhalb des Prozesses. Es gibt auch zwei Optionen für die Out-of-Process-Zustandsverwaltung: Arbeitsspeicherbasierte (Stateserver) und SQL Server basiert (sqlserver). Wir diskutieren kurz mit der Implementierung dieser Optionen.
- Cookieless. Die cookielose Option für ASP.NET ist mit dieser einfachen booleschen Einstellung konfiguriert.
- Timeout Diese Option steuert die Dauer der Sitzung als gültig. Das Sitzungstimeout ist ein gleitender Wert; bei jeder Anforderung wird der Timeoutzeitraum auf die aktuelle Uhrzeit und den Timeoutwert festgelegt.
- Sqlconnectionstring. Die sqlconnectionstring identifiziert die Datenbankverbindungszeichenfolge, die die Datenbank benennt, die für den Modus sqlserver verwendet wird.
- Server: Im Zustandsserver für den Out-of-Process-Modus wird der Server benannt, der den erforderlichen Windows NT-Dienst ausführt: ASPState.
- Port. Die Porteinstellung, die die Servereinstellung begleitet, identifiziert die Portnummer, die der Servereinstellung für den Modusstatusserver entspricht.
Beispielanwendung für sitzungszustand
Bevor wir den Sitzungszustand verwenden, benötigen wir eine Anwendung, um sie zu testen. Nachfolgend finden Sie den Code für eine einfache Visual Basic ® Anwendung, die in den Sitzungszustand schreibt und liest, SessionState.aspx:
<Script runat=server>
Sub Session_Add(sender As Object, e As EventArgs)
Session("MySession") = text1.Value
span1.InnerHtml = "Session data updated! <P>
Your session contains: <font color=red>" +
Session("MySession").ToString() + "</font>"
End Sub
Sub CheckSession(sender As Object, e As EventArgs)
If (Session("MySession") = Isnull) Then
span1.InnerHtml = "NOTHING, SESSION DATA LOST!"
Else
span1.InnerHtml = "Your session contains:
<font color=red>" +
Session("MySession").ToString() + "</font>"
End If
End Sub
</Script>
<form runat=server>
<input id=text1 type=text runat=server>
<input type=submit runat=server
OnServerClick="Session_Add" Value="Add to Session State">
<input type=submit runat=server
OnServerClick="CheckSession" Value="View Session State">
</form>
<hr size=1>
<font size=6><span id=span1 runat=server/></font>
Diese einfache Seite verkabelt zwei serverseitige Ereignisse für die Schaltflächen "Hinzufügen " und "Ansicht ", und legt einfach den Sitzungszustand auf den Wert im Textfeld fest.
Es gibt vier allgemeine Konfigurationseinstellungen, die wir genauer betrachten können: In-Process-Modus, Out-of-Process-Modus, SQL Server Modus und Cookieless.
Prozessmodus
Im Prozessmodus bedeutet es einfach, ASP.NET Sitzungszustand auf ähnliche Weise wie der klassische ASP-Sitzungszustand zu verwenden. Das heißt, der Sitzungszustand wird im Prozess verwaltet und wenn der Prozess erneut ausgeführt wird, geht der Zustand verloren. Angesichts der neuen Einstellungen, die ASP.NET bereitstellt, fragen Sie sich möglicherweise, warum Sie diesen Modus jemals verwenden würden. Die Begründung ist ziemlich einfach: Leistung. Die Leistung des Sitzungszustands, z. B. die Zeit, aus der es zum Lesen und Schreiben in das Sitzungszustandswörterbuch benötigt wird, ist viel schneller, wenn der Speicher gelesen und aus verarbeitet wird, da prozessübergreifende Aufrufe Mehraufwand hinzufügen, wenn Daten von SQL Server ge marshaliert oder möglicherweise aus SQL Server gelesen werden.
Der Prozessmodus ist die Standardeinstellung für ASP.NET. Wenn diese Einstellung verwendet wird, sind die einzigen anderen verwendeten Session config.web settings cookieless und timeout.
Wenn wir SessionState.aspx aufrufen, einen Sitzungsstatuswert festlegen und den ASP.NET Prozess (iisreset) beenden und starten, gehen die Werte verloren, bevor der Prozess ausgeführt wurde.
Out-of-Process-Modus
Im .NET SDK enthalten ist ein Windows ® NT-Dienst: ASPState. Dieser Windows Dienst verwendet ASP.NET für die Verwaltung von Abwesenheitssitzungen. Um diesen Status-Manager zu verwenden, müssen Sie zuerst den Dienst starten. Um den Dienst zu starten, öffnen Sie eine Eingabeaufforderung, und geben Sie Folgendes ein:
net start aspstate
Was Sie sehen werden, ist:
.gif)
Abbildung 1. Starten des Windows NT-Diensts ASPState an der Eingabeaufforderung
An diesem Punkt wurde der Windows NT-Dienst ASPState gestartet und ist für ASP.NET verfügbar. Als Nächstes müssen wir ASP.NET konfigurieren, um diesen Dienst zu nutzen. Dazu müssen wir config.web konfigurieren:
<configuration>
<sessionstate
mode="stateserver"
cookieless="false"
timeout="20"
sqlconnectionstring="data source=127.0.0.1;user id=<user id>;password=<password>"
server="127.0.0.1"
port="42424"
/>
</configuration>
Wir haben uns nur vom inproc Modus in stateserver mode. Diese Einstellung weist ASP.NET an, nach dem ASP-Zustandsdienst auf dem Server zu suchen, der in den server und port den Einstellungen angegeben ist– in diesem Fall der lokale Server.
Jetzt können wir SessionState.aspx aufrufen, einen Sitzungsstatuswert festlegen, den IIS-Prozess beenden und starten (iisreset) und weiterhin Zugriff auf die Werte für unseren aktuellen Zustand haben.
SQL Server Modus
Die Option "SQL Server Modus" ähnelt dem Windows NT-Dienst, außer dass die Informationen auf SQL Server beibehalten werden, anstatt im Arbeitsspeicher gespeichert zu werden.
Um SQL Server als Sitzungszustandsspeicher zu verwenden, müssen wir zuerst die erforderlichen Tabellen und gespeicherten Prozeduren erstellen, nach denen ASP.NET nach den identifizierten SQL Server suchen. Das .NET SDK stellt uns ein SQL Skript (state.sql) bereit, um genau das zu tun.
state.sql
Die Datei state.sql enthält die SQL Befehle, die zum Erstellen der ASPState-Datenbank verwendet werden. Dieses Skript erstellt zwei Tabellen und mehrere gespeicherte Prozeduren. ASP.NET verwendet sowohl die Tabellen als auch die Verfahren zum Speichern von Daten in SQL Server. Ich würde empfehlen, durch state.sql zu lesen, um mehr darüber zu erfahren, was es tut.
Die Datei "state.sql" finden Sie unter [Systemlaufwerk]\winnt\Microsoft.NET\Framework\[Version]\
Anwenden des State.sql-Skripts
Verwenden Sie zum Anwenden des Skripts "state.sql" das Befehlszeilentool SQL Server bietet: osql.exe. Die folgende Syntax wird mithilfe einer sa-entsprechung SQL Benutzers verwendet:
osql –S [server name] –U [user] –P [password] <state.sql
Hinweis: Eine einfache Version von SQL Server wird installiert, wenn das .NET SDK installiert ist.
Hier erfahren Sie, was Sie sehen sollten:
.gif)
Abbildung 2. Verwenden des Befehlszeilentools SQL Server zum Anwenden des Skripts "state.sql"
Nach dem Ausführen von osql starten und beenden Sie SQL Server; Teil des hinzugefügten Zustands.sql waren einige gespeicherte Prozeduren, die ausgeführt werden müssen. Ändern Sie als Nächstes die Konfigurationseinstellungen, um den Modus sqlserver festzulegen und die sqlconnectionstring zu identifizierende SQL Server die ASPState-Datenbank zu identifizieren. Beispiel:
<configuration>
<sessionstate
mode="sqlserver"
cookieless="false"
timeout="20"
sqlconnectionstring="data source=MySqlServer;
user id=ASPState;
password=1Gr8State"
server="127.0.0.1"
port="42424"
/>
</configuration>
Ähnlich wie der Windows NT-Dienststatus-Manager können wir jetzt SessionState.aspx aufrufen, einen Sitzungsstatuswert festlegen, den IIS-Prozess beenden und starten (iisreset) und weiterhin Zugriff auf die Werte für unseren aktuellen Zustand haben. Tatsächlich könnten wir die SQL Server so gruppieren, dass, wenn ein SQL Server nicht verfügbar ist, ein anderer Server, der seine Daten repliziert hat, seinen Platz nehmen kann. Dadurch wird eine Zuverlässigkeitsstufe bereitgestellt, die in ASP nicht verfügbar war.
Cookieless State
Das letzte neue Feature, das wir für ASP.NET Sitzungszustand konfigurieren können, ist der cookielose Sitzungszustand. Im Wesentlichen ermöglicht dieses Feature Websites, deren Clients keine Cookies verwenden, um ASP.NET Sitzungszustand zu nutzen.
Dies erfolgt durch Ändern der URL mit einer ID, die die Sitzung eindeutig identifiziert:
https://localhost/(lit3py55t21z5v55vlm25s55)/Application/SessionState.aspx
ASP.NET ändern relative Links innerhalb der Seite und betten diese ID ein. Solange der Benutzer dem Pfad der von der Website bereitgestellten Links folgt, kann der Sitzungszustand beibehalten werden. Wenn der Endbenutzer die URL jedoch erneut schreibt, geht die Sitzungsstatusinstanz wahrscheinlich verloren.
Das IIS 4.0 Resource Kit hat ein ähnliches Feature bereitgestellt. Es wurde als ISAPI-Filter implementiert, der den eingehenden und ausgehenden Bytestream ändern konnte, um die erforderlichen Informationen zu schreiben und zu lesen. Der Unterschied zwischen diesem und dem ASP.NET Feature ist der Aufwand für die Verwendung des Features. In ASP.NET ist es einfach eine Frage des Kippens eines booleschen Werts in der Datei config.web:
<configuration>
<sessionstate
mode="stateserver"
cookieless="true"
timeout="20"
sqlconnectionstring="data source=127.0.0.1;user id=<user id>;password=<password>"
server="127.0.0.1"
port="42424"
/>
</configuration>
Sobald "cookieless" auf "true" festgelegt ist, wird ASP.NET die erforderliche Arbeit ausführen, um den cookielosen Sitzungszustand zu aktivieren. Beachten Sie auch, dass alle Modi für cookielose Sitzungen unterstützt werden.
Überlegungen zur Leistung und Zuverlässigkeit
Es lohnt sich, kurz zu erwähnen, einige der Leistungs- und Zuverlässigkeitsprobleme, die Sie berücksichtigen sollten, wenn Sie ASP.NET Sitzungszustandsmodi verwenden.
- Im Prozess. Im Prozess wird am besten ausgeführt, da der Sitzungsstatusspeicher innerhalb des ASP.NET Prozesses aufbewahrt wird. Bei Webanwendungen, die auf einem einzelnen Server gehostet werden, werden Anwendungen, in denen der Benutzer garantiert erneut an den richtigen Server weitergeleitet wird, oder wenn Sitzungsstatusdaten nicht kritisch sind (im Sinne, dass er neu erstellt oder erneut ausgefüllt werden kann), ist dies der zu wählende Modus.
- Nicht verarbeitet. Dieser Modus wird am besten verwendet, wenn die Leistung wichtig ist, aber Sie können nicht garantieren, von welchem Server ein Benutzer eine Anwendung anfordert. Im Out-of-Process-Modus erhalten Sie die Leistung des Lesens aus dem Speicher und die Zuverlässigkeit eines separaten Prozesses, der den Zustand für alle Server verwaltet.
- SQL Server. Dieser Modus wird am besten verwendet, wenn die Zuverlässigkeit der Daten grundlegend für die Stabilität der Anwendung ist, da die Datenbank für Fehlerszenarien gruppiert werden kann. Die Leistung ist nicht so schnell wie außerhalb des Prozesses, aber der Handel ist das höhere Maß an Zuverlässigkeit.
Factorability
Was wir in diesem Artikel nicht behandelt haben, und was wir in zukünftigen Artikeln betrachten werden, ist die Faktorierbarkeit von ASP.NET. Im Wesentlichen ist dies die Möglichkeit, ASP.NET Features wie sitzungszustand zu erweitern oder zu ersetzen. Wenn ein Drittanbieter einen erweiterten Sitzungsstatus-Manager bereitstellt, der Sitzungsdaten in einem LDAP-Verzeichnis (Lightweight Directory Access Protocol) speichert, z. B. ein Netscape LDAP-Verzeichnis, kann die Standardimplementierung ASP.NET Sitzungsstatus ersetzt werden.
Zusammenfassung
Wie Sie sehen können, unterscheidet sich ASP.NET Sitzungszustand von ASP-Sitzungszustand. Die neue Funktion des Sitzungszustands, der nicht an den ASP.NET Prozess gebunden ist, bedeutet, dass Entwickler den Sitzungszustand in Serverfarmumgebungen verwenden können, ohne sich Gedanken darüber zu machen, ob der Client über einen Proxyserver kommt. Darüber hinaus ist die Verwendung des Sitzungszustands mit der cookielosen Zustandsfunktionalität noch einfacher und garantiert, dass alle Clients das Feature für den Sitzungsstatus nutzen können.
Im nächsten Artikel sehen wir uns das neue Ablaufverfolgungsfeature in ASP.NET an.
Rob Howard ist Programmmanager für ASP.NET im .NET Frameworks-Team. Er verbringt jede Freizeit, die er entweder mit seiner Familie hat, oder Fliegenfischen in Eastern Washington.