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

125

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.Sessionist 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?
}
Anthony
quelle
ASP.NET WebApi hat ein anderes Verhalten. Sie können es beim Zugriff auf eine Sitzung mit der ASP.NET-Web-API
Tiago Gouvêa,

Antworten:

158

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.

driis
quelle
6
Nur ein kurzes Update, das ich heute gefunden habe. Sitzung ist im Seitenkonstruktor nicht verfügbar! Nur beim Init-Ereignis oder danach.
Nuno Agapito
Ich bin gerade auf eine HttpContext.Current.Session gestoßen. == null ist Code, der von einem Page Load-Ereignis einer Masterseite aufgerufen wird. Anscheinend kann dies im Kontext einer Seite auftreten. Wenn ich das HttpContext.Current-Objekt inspiziere, werden die meisten seiner Mitglieder initialisiert, aber CurrentNotification und IsPostNotification geben einen Fehler aus: {System.PlatformNotSupportedException}. Was auch immer die Ursache sein mag, dieses Problem ist in der Produktion, in der es seit Jahren auftritt, nicht aufgetreten. Die Plattform ist Windows Server 2003 R2 SP2, die Anwendung verfügt über das Zielframework .NET 3.5 und wird in IIS mit aktiviertem Sitzungsstatus ausgeführt.
R. Schreurs
Ich habe auch festgestellt, dass, wenn IIS eine direkte Anforderung für eine auf der Festplatte vorhandene Ressourcendatei wie ein Stylesheet HttpContext.Current.Sessionbereitstellt, 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.
ingredient_15939
Ich denke, es könnte auch null sein, wenn Sie sich in einer von der Ausgabe zwischengespeicherten MVC-Aktion befinden.
user2173353
40

Die folgende Aussage ist nicht ganz richtig:

"Wenn Sie also andere Funktionen, einschließlich statischer Klassen, von Ihrer Seite aus aufrufen, sollte es Ihnen gut gehen."

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:

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

[WebMethod (EnableSession = true)]

Wenn Sie den EnableSession-Wert angeben, können Sie jetzt mit einer verwalteten Sitzung spielen. Wenn Sie diesen Wert nicht angeben, erhalten Sie ein Null-Sitzungsobjekt, und beim Versuch, auf das Sitzungsobjekt zuzugreifen, treten höchstwahrscheinlich Nullreferenzausnahmen auf.

Vielen Dank an Matthew Cozier für die Lösung.

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

Ed

Ed Bishop
quelle
1
danke Ed, Session wurde in der Webmethode als null angezeigt - dies wurde behoben. +1
Fusi
1
Nun, wenn Sie einen Webservice aufrufen, verwenden Sie eine andere Anfrage als für die Seite, sodass diese Aussage immer noch korrekt ist, IMO.
Driis
MSDN-Dokumente hier - the default value is false. Klappt wunderbar.
Benjineer
22

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:

public class MyAshxClass : IHttpHandler, IRequiresSessionState
mathijsuitmegen
quelle
Vielen Dank, die Sitzung in meiner Anmeldeklasse war null. Als ich diesen Code zu meinem Ashx-Handler hinzufügte, wurde die Sitzung auch für meine Klasse aktiviert
Ateş Danış
Ich denke, das beantwortet die Frage ziemlich gut. Vielen Dank.
Sachin Joseph
2

Technische Artikel zu ASP.NET

ZUSAMMENFASSUNG: In ASP.NET leitet sich jede Webseite von der System.Web.UI.Page-Klasse ab. Die Page-Klasse aggregiert eine Instanz des HttpSession-Objekts für Sitzungsdaten. Die Page-Klasse macht verschiedene Ereignisse und Methoden zur Anpassung verfügbar. Insbesondere wird die OnInit-Methode verwendet, um den Initialisierungsstatus des Page-Objekts festzulegen. Wenn die Anforderung kein Sitzungscookie enthält, wird dem Anforderer ein neues Sitzungscookie ausgegeben.

BEARBEITEN:

Session: Ein Konzept für Anfänger

ZUSAMMENFASSUNG: Die Sitzung wird erstellt, wenn der Benutzer eine erste Anforderung für eine Seite in der Webanwendung an den Server sendet. Die Anwendung erstellt die Sitzung und sendet die Sitzungs-ID mit der Antwort an den Benutzer zurück. Sie wird als kleines Cookie auf dem Clientcomputer gespeichert . Idealerweise wird der "Computer, der die Cookies deaktiviert hat, Sitzungsinformationen nicht gespeichert".

Adatapost
quelle
1

In meinem Fall ASP.NET State Service wurde gestoppt. Ändern der Startup typean Automaticund startet den Dienst manuell zum ersten Mal lösten das Problem.

Eric
quelle