In meiner Webanwendung lese ich die Sitzungsvariablen wie folgt:
if (HttpContext.Current.Session != null && HttpContext.Current.Session["MyVariable"] != null)
{
string myVariable= (string)HttpContext.Current.Session["MyVariable"];
}
Ich verstehe, warum es wichtig ist zu überprüfen, warum HttpContext.Current.Session ["MyVariable"] null ist (die Variable wurde möglicherweise noch nicht in der Sitzung gespeichert oder die Sitzung wurde aus verschiedenen Gründen zurückgesetzt), aber warum muss ich überprüfen wenn HttpContext.Current.Session
ist null?
Nach meinem Verständnis wird die Sitzung automatisch von ASP.NET erstellt, daher sollte HttpContext.Current.Session niemals null sein. Ist diese Annahme richtig? Wenn es null sein kann, heißt das, dass ich es auch überprüfen sollte, bevor ich etwas darin speichere:
if (HttpContext.Current.Session != null)
{
HttpContext.Current.Session["MyVariable"]="Test";
}
else
{
// What should be done in this case (if session is null)?
// Is it possible to force the session to be created if it doesn't exist?
}
Antworten:
Ja, das Sitzungsobjekt ist möglicherweise null, aber nur unter bestimmten Umständen, auf die Sie nur selten stoßen:
Wenn Sie nur Code in Seiten haben, werden Sie nicht darauf stoßen. Der größte Teil meines ASP .NET-Codes verwendet Session, ohne wiederholt nach Null zu suchen. Es ist jedoch etwas zu überlegen, ob Sie ein IHttpModule entwickeln oder auf andere Weise die gröberen Details von ASP .NET kennen.
Bearbeiten
Antwort auf den Kommentar: Ob der Sitzungsstatus verfügbar ist oder nicht, hängt davon ab, ob das AcquireRequestState-Ereignis für die Anforderung ausgeführt wurde. Hier erledigt das Sitzungsstatusmodul seine Arbeit, indem es das Sitzungscookie liest und den geeigneten Satz von Sitzungsvariablen für Sie findet.
AcquireRequestState wird ausgeführt, bevor die Kontrolle an Ihre Seite übergeben wird. Wenn Sie also andere Funktionen, einschließlich statischer Klassen, von Ihrer Seite aus aufrufen, sollte dies in Ordnung sein.
Wenn einige Klassen während des Startvorgangs eine Initialisierungslogik ausführen, z. B. beim Application_Start-Ereignis oder mithilfe eines statischen Konstruktors, ist der Sitzungsstatus möglicherweise nicht verfügbar. Alles läuft darauf hinaus, ob eine aktuelle Anforderung vorliegt und AcquireRequestState ausgeführt wurde.
Sollte der Client Cookies deaktiviert haben, ist das Sitzungsobjekt weiterhin verfügbar. Bei der nächsten Anforderung kehrt der Benutzer jedoch mit einer neuen leeren Sitzung zurück. Dies liegt daran, dass der Client einen Sitzungsstatusbeutel erhält, falls er noch keinen hat. Wenn der Client das Sitzungscookie nicht transportiert, können wir den Client nicht als denselben identifizieren, sodass ihm immer wieder eine neue Sitzung übergeben wird.
quelle
HttpContext.Current.Session
bereitstellt, der Code in "Application_AcquireRequestState" null sein kann. Die Anforderung für die Seite selbst macht das Sitzungsobjekt jedoch für den Code dort verfügbar. Dies ist mindestens unter MVC.NET 4.Die folgende Aussage ist nicht ganz richtig:
Ich rufe eine statische Methode auf, die über HttpContext.Current.Session auf die Sitzung verweist, und sie ist null. Ich rufe die Methode jedoch über eine Webservice-Methode über Ajax mit jQuery auf.
Wie ich hier herausgefunden habe , können Sie das Problem mit einem einfachen Attribut für die Methode beheben oder das Webdienst-Sitzungsobjekt verwenden:
Vielen Dank an Matthew Cozier für die Lösung.
Ich dachte nur, ich würde meine zwei Cent hinzufügen.
Ed
quelle
the default value is false
. Klappt wunderbar.Wenn Ihre Sitzungsinstanz null ist und sich in einer 'ashx'-Datei befindet, implementieren Sie einfach die' IRequiresSessionState'-Schnittstelle.
Diese Schnittstelle hat keine Mitglieder, daher müssen Sie nur den Schnittstellennamen nach der Klassendeklaration (C #) hinzufügen:
quelle
Technische Artikel zu ASP.NET
BEARBEITEN:
Session: Ein Konzept für Anfänger
quelle
In meinem Fall
ASP.NET State Service
wurde gestoppt. Ändern derStartup type
anAutomatic
und startet den Dienst manuell zum ersten Mal lösten das Problem.quelle