Frage: Warum geht die Sitzung auf manchen Rechnern gelegentlich verloren?
Antwort: Möglicherweise hängt es mit der Maschinenumgebung zusammen, z. B. mit der Firewall oder der Antivirensoftware. Versuchen Sie, die Firewall auszuschalten.
F: Warum wird die Session_End-Methode nicht ausgelöst, wenn Session.Abandon aufgerufen wird?
Antwort: Zunächst einmal unterstützt die Session_End-Methode nur eine Sitzung vom Typ InProc (In-Proc). Zweitens muss zum Aktivieren der Session_End-Methode die Sitzung vorhanden sein (dh die Sitzung wurde im System verwendet) und mindestens eine Anforderung muss abgeschlossen sein (diese Methode wird in dieser Anforderung aufgerufen).
F: Warum geht meine Sitzung oft verloren, wenn ich sie im InProc-Modus verwende?
Antwort: Dieses Problem wird normalerweise dadurch verursacht, dass die Anwendung recycelt wird, denn wenn die In-Process-Sitzung verwendet wird, wird die Sitzung im aspnet_wp-Prozess gespeichert. Wenn der Prozess recycelt wird, wird die Sitzung natürlich gelöscht recycelt wurden, können Sie die Ereignisanzeige Ihres Systems auf Informationen überprüfen.
Spezifische Informationen finden Sie unter:
Sitzungsvariablen gehen in ASP.NET-Anwendungen zeitweise verloren
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q316148
Es gab auch einen Fehler in 1.0, der dazu führte, dass der Arbeitsprozess recycelt und neu gestartet wurde. Dieser Fehler wurde in 1.1 und SP2 behoben.
Ausführliche Informationen zu diesem Fehler finden Sie unter:
Der ASP.NET-Arbeitsprozess (Aspnet_wp.exe) wird unerwartet recycelt.
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q321792
Frage: Warum ist die ID der neuen Sitzung dieselbe wie die der ursprünglichen, nachdem die Sitzung abgelaufen ist oder abgebrochen wurde?
Antwort: Da die Sitzungs-ID in der Instanz des Client-Browsers gespeichert wird, wird die vom Browser übergebene Sitzungs-ID verwendet, wenn die Sitzung abläuft und die Sitzung erneut auf dem Server eingerichtet wird. Die Sitzungs-ID ändert sich nach der Wiederherstellung nicht.
F: Warum ist die SessionID für jede Anfrage unterschiedlich?
Antwort: Dieses Problem kann dadurch verursacht werden, dass in der Sitzung keine Informationen gespeichert werden, d. h. die Sitzung wird nirgendwo im Programm verwendet. Nachdem die Informationen in der Sitzung gespeichert wurden, ist die Sitzungs-ID immer mit dem Browser verknüpft und die Sitzungs-ID ändert sich zu diesem Zeitpunkt nicht.
F: Kann eine Sitzung zwischen ASP und ASP.NET geteilt werden?
Antwort: Ja. Dies ist jedoch ein relativ komplizierter Prozess. Microsoft bietet eine offizielle Lösung an: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspp/html/ConvertToASPNET.aspQ
: Welche Arten von Objekten können in Session gespeichert werden?
Antwort: Dies hängt vom verwendeten Sitzungsmodus ab. Bei Verwendung einer In-Process-Sitzung (InProc) kann jedes Objekt problemlos gespeichert werden. Wenn Sie einen Nicht-InProc-Modus verwenden, können Sie nur Objekte speichern, die serialisiert und deserialisiert werden können. Wenn das zu diesem Zeitpunkt gespeicherte Objekt die Serialisierung nicht unterstützt, kann es nicht in der Sitzung dieses Modus (Nicht-InProc) gespeichert werden.
F: Warum kann ich die Methoden Response.Redirect und Server.Transfer in Session_End nicht verwenden, um zu einer Seite zu springen?
Antwort: Session_End ist eine Ereignisverarbeitungsfunktion, die innerhalb des Servers ausgelöst wird. Es basiert auf einem Timer innerhalb des Servers. Wenn das Ereignis ausgelöst wird, gibt es kein relevantes HttpRequest-Objekt auf dem Server, sodass die Methoden Response.Redirect und Server.Transfer derzeit nicht verwendet werden können.
F: Kann ich das HttpContext-Objekt in Session_End abrufen?
Antwort: Nein, da dieses Ereignis keiner Anfrage (Request) zugeordnet ist und keinen anfragebasierten Kontext hat.
Frage: Wie verwende ich eine Sitzung im Webdienst?
Antwort: Um die Sitzung im Webdienst verwenden zu können, muss der Aufrufer des Webdienstes einige zusätzliche Arbeiten ausführen und das beim Aufruf des Webdienstes verwendete Cookie muss gespeichert und gespeichert werden. Einzelheiten finden Sie in der MSDN-Dokumentation für die HttpWebClientProtocol.CookieContainer-Eigenschaft. Wenn Sie jedoch aufgrund von Framework-Einschränkungen einen Proxyserver für den Zugriff auf den Webdienst verwenden, können beide die Sitzung nicht gemeinsam nutzen.
Frage: Warum kann ich Session nicht verwenden, wenn ich meinen eigenen HttpHandler anpasse?
Antwort: Wenn Sie Ihren eigenen HttpHandler implementieren möchten, müssen Sie eine der beiden folgenden Markierungsschnittstellen implementieren: IRequiresSessionState und IReadOnlySessionState. Diese Schnittstellen verfügen nicht über Methoden, die implementiert werden müssen die Methode zur Verwendung der INamingContainer-Schnittstelle.
F: Wenn ich Webfarm verwende, warum geht die Sitzung verloren, wenn ich auf einen anderen Webserver umleite?
Antwort: Ausführliche Informationen finden Sie unter:
PRB: Der Sitzungsstatus geht in der Webfarm verloren, wenn Sie den SqlServer- oder StateServer-Sitzungsmodus verwenden
http://support.microsoft.com/default.aspx?scid=kb;en-us;325056Q
: Warum ist meine Sitzung in der Application_OnAcquireRequestState-Methode ungültig?
Antwort: Die Sitzung ist erst gültig, nachdem das HttpApplication.AcquireRequestState-Ereignis aufgerufen wurde.
Ausführliche Informationen finden Sie unter:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconhandlingpublicevents.asp
F: Wie leite ich von einer HTTP-Seite zu HTTPS um, wenn Cookieless verwendet wird?
Antwort: Bitte probieren Sie die folgenden Methoden aus:
String originalUrl = "/fxtest3/sub/foo2.aspx";
String ModifiedUrl = " https://localhost " + Response.ApplyAppPathModifier(originalUrl);
Response.Redirect(modifiedUrl);
F: Ist die Sitzung in diesen Ereignissen in global.asax gültig?
Antwort: Session ist erst nach dem AcquireRequestState-Ereignis gültig und Ereignisse nach diesem Ereignis können Session verwenden.
F: Wie kann ich alle Objekte in der aktuellen Sitzung speichern?
Antwort: Es kann durch Durchlaufen aller Session.Keys erhalten werden. Der Code lautet wie folgt:
ArrayList sessionCollection = new ArrayList();
foreach (String strKey in Session.Keys){
sessionCollection.Add(Session[strKey]);
}
F: Ist es möglich, Sitzungen in verschiedenen Anwendungen zu teilen?
Antwort: Es kann nicht direkt geteilt werden. Hier erfahren Sie, wie Sie eine Sitzung zwischen ASP und ASP.NET teilen.
F: Was ist der Unterschied zwischen Session.Abandon und Session.Clear?
Antwort: Der Hauptunterschied besteht darin, dass bei Verwendung von Session.Abandon die Session_End-Methode (im InProc-Modus) aufgerufen wird. Die Session_Start-Methode wird ausgelöst, wenn die nächste Anfrage eintrifft. Session.Clear löscht nur alle Daten in der Sitzung und beendet die Sitzung nicht, daher werden diese Methoden nicht aufgerufen.
Frage: Bietet Session einen Sperrmechanismus, um sequentiell auf den Statuswert von Session zugreifen zu können?
Antwort: Session implementiert den Reader/Writer-Sperrmechanismus:
Wenn die Seite über Schreibberechtigungen für die Sitzung verfügt (d. h. die Seite verfügt über das Tag <%@ Page EnableSessionState="True" %>), hält die Sitzung der Seite eine Schreibsperre, bis die Anforderung abgeschlossen ist.
Wenn die Seite über eine schreibgeschützte Funktionalität für die Sitzung verfügt (d. h. die Seite verfügt über das Tag <%@ Page EnableSessionState="ReadOnly" %>), verfügt die Sitzung, die den Abschluss der Seite angefordert hat, über eine Lesesperre.
Eine Lesesperre blockiert eine Schreibsperre; eine Lesesperre blockiert keine Lesesperre; eine Schreibsperre blockiert alle Lese- und Schreibsperren. Wenn dieselbe Seite in zwei Frames in dieselbe Sitzung schreibt, muss daher einer von ihnen warten, bis der andere (der etwas schnellere) fertig ist, bevor er mit dem Schreiben beginnt.
F: Was bedeutet ein Session-Smooth-Timeout?
Antwort: Sitzungsglättungs-Timeout bedeutet, dass das Timeout aktualisiert wird (kann als Retiming verstanden werden), solange Ihre Seite auf die Sitzung zugreift (sie verwendet), d. h. das Timeout wird ab der Seitenanforderung neu berechnet. Die Seite kann die Sitzung jedoch nicht deaktivieren. Es greift automatisch auf die Sitzung der aktuellen Seite zu und aktualisiert das Timeout.
Frage: Warum ist Session in der Event-Handling-Funktion in global.asax ungültig?
Antwort: Es hängt davon ab, in welcher Event-Handling-Funktion die Session verwendet wird. Session ist nur nach dem AcquireRequestState-Ereignis gültig. Alle Event-Handling-Funktionen nach diesem Ereignis können Session verwenden, nicht jedoch die davor.
Frage: Wenn ich eine Komponente schreibe, die von der Sitzung der aktuellen Anwendung abhängt, warum kann ich dann nicht direkt Session["Key"] verwenden, um ihren Wert abzurufen?
Antwort: Session["Key"] ist eigentlich this.Session["Key"], das als Eigenschaft von Page bereitgestellt wird, sodass Sie diese Eigenschaft nicht direkt in Ihrer Komponente verwenden können. Sie können Session auf folgende Weise verwenden:
HttpContext.Current.Session["Key"] = "My Seesion Value";
F: Wenn ich den InProc-Modus zum Speichern der Sitzung verwende, wo wird die Sitzung zu diesem Zeitpunkt gespeichert?
Antwort: Verschiedene IIS haben unterschiedliche Verarbeitungsmethoden.
Bei Verwendung von IIS5 wird die Sitzung im Prozessraum von aspnet_wp.exe gespeichert.
Bei Verwendung von IIS6 teilen sich alle Anwendungen standardmäßig den Anwendungspool und die Sitzung wird im Prozessbereich von w3wp.exe gespeichert.
F: Ist die Einstellung für das Sitzungs-Timeout in Minuten oder Sekunden angegeben?
Antwort: Es sind Minuten, der Standardwert ist 20 Minuten.
F: Wird meine Sitzung gespeichert, wenn auf der Seite ein Fehler auftritt? Ich muss in Session_End etwas aufräumen, aber es schlägt fehl. Warum?
Antwort: Session_End wird nur ausgeführt, wenn die Sitzung im InProc-Modus ausgeführt wird. Das von Session_End verwendete Konto ist das Konto, das den Arbeitsprozess aspnet_wp ausführt (dies kann in machine.config festgelegt werden). Wenn Sie daher integrierte Sicherheit zum Herstellen einer Verbindung zu SQL in der Session_End-Methode verwenden, wird der Link über das Konto des aspnet_wp-Prozesses geöffnet. Erfolg oder Misserfolg zu diesem Zeitpunkt hängt von Ihren SQL-Sicherheitseinstellungen ab.
Frage: Warum verliere ich die Sitzung, wenn ich umleite, wenn ich „Cookieless“ auf „true“ setze?
Antwort: Wenn Sie ohne Cookies arbeiten, müssen Sie relative Pfade verwenden, um absolute Pfade im Programm zu ersetzen. Wenn Sie absolute Pfade verwenden, kann ASP.NET die SessionID nicht in der URL speichern.
Beispiel: Ersetzen Sie myDirmySubdirdefault.aspx durch ..default.aspx.
Frage: Wie speichere ich SortedList in einer Sitzung oder einem Cache?
Antwort: Bitte beachten Sie die folgenden Methoden:
SortedList x = new SortedList();
x.Add("Key1", "ValueA");
x.Add("Key2", "ValueB");
In Sitzung speichern:
Session["SortedList1"] = x;
Verwenden Sie die folgende Methode, um es zu erhalten:
SortedList y = (SortedList) Session["SortedList1"];
Das Gleiche gilt für Chahe.
F: Warum erhalte ich die Fehlermeldung „Der Sitzungsstatus kann nur verwendet werden, wenn enableSessionState entweder in einer Konfigurationsdatei oder in der Page-Direktive auf true gesetzt ist“?
Antwort: Dieses Problem kann nach der Installation von Windows Sharepoint Server (WSS) auf einem Computer auftreten, auf dem die Entwicklungsumgebung Microsoft Visual Studio .NET installiert ist.
Der WSS ISAPI-Filter verarbeitet alle Anfragen. Wenn Sie eine ASP.NET-Anwendung über ein virtuelles Verzeichnis durchsuchen, weist der ISAPI-Filter dem Ordnerverzeichnis keine URLs zu.
Die Lösung lautet: Verwenden Sie Session nicht auf dem Computer, auf dem WSS installiert ist.
Ausführliche Informationen finden Sie unter:
Der Sitzungsstatus kann in ASP.NET nicht mit Windows SharePoint Services verwendet werden
http://support.microsoft.com/default.aspx?scid=kb;en-us;837376Q
: Wie lösche ich Sitzungsvariablen?
Antwort: Wenn Sie die Session-Variable löschen möchten, können Sie die Methode HttpSessionState.Remove() verwenden.
F: Gibt es eine Möglichkeit herauszufinden, wie viel Speicher die Sitzung einer Anwendung während der Ausführung einnimmt?
Antwort: Nein. Dieser Wert kann derzeit nicht verifiziert werden, zumindest habe ich dazu noch keine Informationen gesehen. Über den Performance-Monitor und den Programmcode lässt sich jedoch ein Wert grob abschätzen.
Frage: Wenn auf der Seite ein Frameset vorhanden ist, wird bei der ersten Anfrage festgestellt, dass die Sitzungs-ID der in jedem Frame angezeigten Seite unterschiedlich ist.
Antwort: Der Grund dafür ist, dass Ihr Frameset auf einer HTML-Seite und nicht auf einer ASPX-Seite platziert ist.
Wenn es sich bei dem Frameset um eine ASPX-Seite handelt, wird die Anforderung unter normalen Umständen zunächst an den Webserver gesendet und die Sitzungs-ID abgerufen. Anschließend fordert der Browser jeweils andere Seiten im Frame an SessionID aller Seiten Es ist dasselbe, es ist die SessionID der FrameSet-Seite.
Wenn Sie jedoch eine HTML-Seite zum Erstellen einer FrameSet-Seite verwenden, ist die erste Anforderung die HTML-Seite. Wenn die Seite vom Server zurückgegeben wird, wird keine Sitzung generiert. Dann fordert der Browser die Seiten im Frame an Seiten generieren ihre eigene SessionID, daher tritt in diesem Fall dieses Problem auf. Wenn Sie die Seite aktualisieren, ist die SessionID dieselbe und die SessionID der zuletzt angeforderten Seite.
F: Ist es möglich, Sitzungen verschiedener Anwendungen in verschiedenen Datenbanken auf demselben SQL Server-Server zu speichern?
Antwort: Ja, bitte beziehen Sie sich auf:
FIX: Die Verwendung einer SQL-Datenbank für alle Anwendungen für den SQL Server-Sitzungsstatus kann zu einem Engpass führen
http://support.microsoft.com/default.aspx?scid=kb;en-us;836680Q
: Kann ich gültige HttpSessionState- und HttpContext-Objekte in Session_End erhalten?
Antwort: Sie können das HttpSessionState-Objekt in dieser Methode abrufen und über Session direkt darauf zugreifen. Das HttpContext-Objekt kann jedoch nicht abgerufen werden, da das Ereignis keiner Anforderung zugeordnet ist und daher kein Kontextobjekt vorhanden ist.
F: Warum läuft meine Sitzung nicht ab, wenn ich die Sitzung im SQL Server-Modus verwende?
Antwort: Im SqlServer-Modus wird der Sitzungsablauf durch die Registrierung des SQL-Agenten abgeschlossen. Bitte überprüfen Sie, ob Ihr SQL-Agent ausgeführt wird.
F: Nachdem ich EnableSessionState auf „ReadOnly“ gesetzt habe, kann ich den Sitzungswert immer noch im InProc-Modus ändern.
Antwort: Auch wenn EnableSessionState als ReadOnly markiert ist, können Benutzer die Sitzung weiterhin im InProc-Modus bearbeiten. Der einzige Unterschied besteht darin, dass die Sitzung während der Anfrage nicht gesperrt wird.
F: Wie kann ich die Angabe eines Passworts beim Verknüpfen von SQL vermeiden?
Antwort: Verwenden Sie einen vertrauenswürdigen Link oder eine verschlüsselte Linkzeichenfolge. Weitere Informationen hierzu finden Sie unter:
So verwenden Sie das ASP.NET-Dienstprogramm zum Verschlüsseln von Anmeldeinformationen und Verbindungszeichenfolgen für den Sitzungsstatus
http://support.microsoft.com/default.aspx?scid=kb;en-us;329290F
: Wie soll ich Session in meiner eigenen Klasse verwenden?
Antwort: Sie können HttpContext.Current.Session verwenden. Die spezifische Methode lautet wie folgt:
HttpContext.Current.Session["SessionKey"] = "SessionValue";
Ebenso können Sie das Application-Objekt auf diese Weise verwenden.
F: Warum bleibt meine Anfrage hängen, nachdem ich in den SQL Server-Modus gewechselt bin?
Antwort: Überprüfen Sie, ob alle in der Sitzung gespeicherten Objekte im SQL Server-Modus gespeichert werden können, dh diese Objekte müssen die Serialisierung unterstützen.
Frage: Welche Auswirkungen hat es, wenn die Sitzung auf „Cookie-frei“ eingestellt ist?
Antwort: Wenn cookieless auf true gesetzt ist, gibt es hauptsächlich die folgenden Einschränkungen:
1. Absolute Links können auf der Seite nicht verwendet werden
2. Zusätzlich zum Wechsel zwischen HTTP und HTTPS müssen in der Anwendung einige weitere Schritte ausgeführt werden.
Wenn Sie einen Link an eine andere Person senden, enthält die URL zu diesem Zeitpunkt Sitzungs-ID-Informationen, sodass die beiden Personen eine Sitzung teilen.
F: Kann die Sitzung in der Datenbank gespeichert werden?
Antwort: Weitere Informationen finden Sie natürlich unter: http://support.microsoft.com/default.aspx?scid=kb;en-us;311209
--------------- -------------------------------------------------- -------------------------------------------------- -- -
F: Warum geht meine Sitzung oft verloren, wenn ich sie im InProc-Modus verwende?
Eine weitere Situation: Wenn Sie eine Access-Datenbank verwenden, denken einige Leute möglicherweise darüber nach, die Datenbankdatei im bin-Verzeichnis abzulegen, damit die Datenbank nicht heruntergeladen werden kann. Wenn sie sich jedoch im InProc-Modus befindet , führt dies ebenfalls zu einem Sitzungsverlust. Denn beim Zugriff auf die Anwendung werden häufig Daten in die Datenbank geschrieben, was zu Änderungen in den im Bin-Verzeichnis abgelegten Datenbankdateien führt und Änderungen am Bin-Verzeichnis zum Verlust der Sitzung führen.
Um dieses Problem zu lösen, können Sie den Speicherpfad der Datenbankdatei ändern oder den StateServer- oder SqlServer-Modus verwenden.
Weitere Informationen finden Sie unter:
PRB: Sitzungsdaten gehen verloren, wenn Sie den ASP.NET InProc-Sitzungsstatusmodus verwenden
http://support.microsoft.com/default.aspx?scid=kb;en-us;324772
-------------------------------------------------- ---------
Gemeinsame Sitzung mit mehreren Projekten in Asp.net, ausgewählt aus dem Blog von dnyz
http://dev.csdn.net/article/21/21714.shtm
1. Erstellen Sie eine leere Lösung, z. B.: d:MyProjectMyProject.sln
2. Erstellen Sie ein Webanwendungs-Stammverzeichnis d:MyProjectWebMis unter d:MyProject und legen Sie es auf das virtuelle Verzeichnis http://localhost/WebMis fest
3. Erstellen Sie neue Verzeichnisse entsprechend den Modulen im WebMis-Verzeichnis, z. B.: d:MyProjectWebMisLogin und d:MyProjectWebMisCheckOut
4. Erstellen Sie eine neue Webanwendung basierend auf dem Modul in VS.net, z. B.: http://localhost/WebMis/Login und http://localhost/WebMis/CheckOut
5. Nach der Erstellung werden die Login- und CheckOut-Verzeichnisse automatisch als virtuelle Verzeichnisse festgelegt.
6. Fügen Sie Projektreferenzen für Login und CheckOut im WebMis-Projekt hinzu
7. Löschen Sie die virtuellen Verzeichnisse „Login“ und „CheckOut“ im IIS-Manager
8. Löschen Sie die global.asax jedes Projekts (entfernen Sie das Stammprojekt).
9. Entfernen Sie den folgenden Code in der web.config des Projekts (entfernen Sie das Root-Projekt):
<authentication mode="Windows" />
<sessionState mode="InProc" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes" cookieless="false" timeout="20" />
Oder löschen Sie web.config (wenn Sie es nicht in jedem Verzeichnis konfigurieren müssen)
10. Nach der Kompilierung kann es ausgeführt werden.