Was kann ich tun, wenn die aktuelle ASP.NET-Sitzung null ist?

In meiner Webanwendung mache ich so etwas, um die Sitzungsvariablen zu lesen:

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 null ist?

Mein Verständnis ist, dass die Sitzung automatisch von ASP.NET erstellt wird, daher sollte HttpContext.Current.Session nie null sein. Ist diese Annahme richtig? Wenn es null sein kann, bedeutet das, dass ich es auch überprüfen sollte, bevor ich etwas darin ablege:

 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? } 

Ja, das Session-Objekt ist möglicherweise null, aber nur unter bestimmten Umständen, denen Sie nur selten begegnen:

  • Wenn Sie das SessionState http-Modul deaktiviert haben, deaktivieren Sie die Sitzungen vollständig
  • Wenn Ihr Code vor dem HttpApplication.AcquireRequestState- Ereignis ausgeführt wird.
  • Ihr Code wird in einem IHttpHandler ausgeführt , der weder die IRequiresSessionState- Schnittstelle noch die IReadOnlySessionState- Schnittstelle angibt .

Wenn Sie nur Code in Seiten haben, werden Sie nicht darauf stoßen. Der Großteil meines ASP .NET-Codes verwendet Session, ohne wiederholt auf null zu prüfen. Es ist jedoch etwas, worüber Sie nachdenken sollten, wenn Sie ein IHttpModule entwickeln oder anderweitig in den gruseligeren Details von ASP .NET stecken.

Bearbeiten

Als 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. Dies ist der Fall, wenn das Sitzungsstatusmodul seine Aufgabe erfüllt, indem es den Sitzungscookie liest und den passenden Satz von Sitzungsvariablen für Sie ermittelt.

AcquireRequestState wird ausgeführt, bevor die Steuerung an Ihre Seite übergeben wird. Wenn Sie also andere functionen, einschließlich statischer classn, von Ihrer Seite aufrufen, sollten Sie in Ordnung sein.

Wenn während des Starts einige classn Initialisierungslogik ausführen, z. B. beim Ereignis Application_Start oder mithilfe eines statischen Konstruktors, ist der Sitzungsstatus möglicherweise nicht verfügbar. Es läuft alles darauf hinaus, ob eine aktuelle Anfrage vorliegt und AcquireRequestState ausgeführt wurde.

Wenn der Client Cookies deaktiviert hat, 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 Session-Statebag erhält, wenn er noch keinen hat. Wenn der Client den Sitzungscookie nicht transportiert, können wir den Client nicht als den gleichen identifizieren, so dass er immer wieder eine neue Sitzung erhält.

Die folgende Aussage ist nicht ganz korrekt:

“Wenn Sie also andere functionen, einschließlich statischer classn, von Ihrer Seite aufrufen, sollte es Ihnen gut gehen.”

Ich rufe eine statische Methode auf, die die Sitzung über HttpContext.Current.Session referenziert, und es ist null. Allerdings rufe ich die Methode über eine Webservice-Methode durch Ajax mit jQuery.

Wie ich hier herausgefunden habe , können Sie das Problem mit einem einfachen Attribut in der Methode beheben oder das Web-Service-Session-Objekt verwenden:

Es gibt jedoch einen Trick: Um auf den Sitzungsstatus innerhalb einer Webmethode zuzugreifen, müssen Sie die Sitzungszustandsverwaltung wie folgt aktivieren:

[WebMethod (AktivierenSitzung = True)]

Durch Angabe des EnableSession-Werts haben Sie jetzt eine verwaltete Sitzung, mit der Sie spielen können. Wenn Sie diesen Wert nicht angeben, erhalten Sie ein Session-Objekt mit dem Wert null und mehr als wahrscheinlich Null-Referenz-Exceptions, während Sie versuchen, auf das Sitzungsobjekt zuzugreifen.

Danke an Matthew Cozier für die Lösung.

Ich dachte nur, ich würde meine zwei Cent addieren.

Ed

Wenn Ihre Session-Instanz null ist und Sie in einer ‘aschex’-Datei sind, implementieren Sie einfach die’ IRequiresSessionState’-Schnittstelle.

Diese Schnittstelle hat keine Mitglieder, daher müssen Sie nur den Namen der Schnittstelle nach der classndeklaration (C #) hinzufügen:

 public class MyAshxClass : IHttpHandler, IRequiresSessionState 

Technische Artikel zu ASP.NET

Alles schließen Zusammenfassung: In ASP.NET wird jede Webseite von der System.Web.UI.Page-class abgeleitet. Die Page-class aggregiert eine Instanz des HttpSession-Objekts für Sitzungsdaten. Die Page-class macht verschiedene Ereignisse und Methoden für die Anpassung verfügbar. Insbesondere wird die OnInit-Methode verwendet, um den Initialisierungsstatus des Page-Objekts festzulegen. Wenn die Anfrage keinen Sitzungscookie hat, wird ein neuer Sitzungscookie an den Anforderer ausgegeben.

BEARBEITEN:

Session: Ein Konzept für Anfänger

Alles schließen Zusammenfassung: Sitzung wird erstellt, wenn Benutzer eine erste Anforderung an den Server für jede Seite in der Webanwendung sendet, erstellt die Anwendung die Sitzung und sendet die Sitzungs-ID mit der Antwort zurück an den Benutzer und wird auf dem Clientcomputer als ein kleines Cookie gespeichert . Im Idealfall der “Rechner, der die Cookies deaktiviert hat, werden Sitzungsinformationen nicht gespeichert”.