(Der Vollständigkeit halber aktualisiert)
Sie können von jeder Seite oder jedem Steuerelement mit Session["loginId"]
und von jeder Klasse (z. B. aus einer Klassenbibliothek) mit auf Sitzungsvariablen zugreifenSystem.Web.HttpContext.Current.Session["loginId"].
Aber bitte lesen Sie weiter für meine ursprüngliche Antwort ...
Ich verwende immer eine Wrapper-Klasse um die ASP.NET-Sitzung, um den Zugriff auf Sitzungsvariablen zu vereinfachen:
public class MySession
{
// private constructor
private MySession()
{
Property1 = "default value";
}
// Gets the current session.
public static MySession Current
{
get
{
MySession session =
(MySession)HttpContext.Current.Session["__MySession__"];
if (session == null)
{
session = new MySession();
HttpContext.Current.Session["__MySession__"] = session;
}
return session;
}
}
// **** add your session properties here, e.g like this:
public string Property1 { get; set; }
public DateTime MyDate { get; set; }
public int LoginId { get; set; }
}
Diese Klasse speichert eine Instanz von sich selbst in der ASP.NET-Sitzung und ermöglicht es Ihnen, von jeder Klasse aus typsicher auf Ihre Sitzungseigenschaften zuzugreifen, z. B.: Z.
int loginId = MySession.Current.LoginId;
string property1 = MySession.Current.Property1;
MySession.Current.Property1 = newValue;
DateTime myDate = MySession.Current.MyDate;
MySession.Current.MyDate = DateTime.Now;
Dieser Ansatz hat mehrere Vorteile:
- es erspart dir viel typgießen
- Sie müssen in Ihrer gesamten Anwendung keine fest codierten Sitzungsschlüssel verwenden (z. B. Sitzung ["loginId"]].
- Sie können Ihre Sitzungselemente dokumentieren, indem Sie XML-Dokumentkommentare zu den Eigenschaften von MySession hinzufügen
- Sie können Ihre Sitzungsvariablen mit Standardwerten initialisieren (z. B. sicherstellen, dass sie nicht null sind).
Greifen Sie über die Threads HttpContext auf die Sitzung zu: -
quelle
Das Problem mit der vorgeschlagenen Lösung besteht darin, dass einige im SessionState integrierte Leistungsmerkmale beeinträchtigt werden können, wenn Sie einen Sitzungsspeicher außerhalb des Prozesses verwenden. (entweder "State Server Mode" oder "SQL Server Mode"). In oop-Modi müssen die Sitzungsdaten am Ende der Seitenanforderung serialisiert und am Anfang der Seitenanforderung deserialisiert werden, was kostspielig sein kann. Um die Leistung zu verbessern, versucht der SessionState, nur das zu deserialisieren, was von der ersten Deserialisierung der Variablen beim ersten Zugriff benötigt wird, und nur die geänderten Variablen neu zu serialisieren und zu ersetzen. Wenn Sie eine Menge Sitzungsvariablen haben und diese alle in eine Klasse verschieben, wird im Wesentlichen alles in Ihrer Sitzung bei jeder Seitenanforderung, die die Sitzung verwendet, deserialisiert, und alles muss erneut serialisiert werden, selbst wenn nur 1 Eigenschaft geändert wurde, weil sich die Klasse geändert hat. Nur etwas zu beachten, wenn Sie viel Sitzung und einen oop-Modus verwenden.
quelle
Die vor mir vorgelegten Antworten bieten geeignete Lösungen für das Problem. Ich halte es jedoch für wichtig zu verstehen, warum dieser Fehler auftritt:
Die
Session
Eigenschaft vonPage
gibt eine Instanz vom TypHttpSessionState
relativ zu dieser bestimmten Anforderung zurück.Page.Session
ist eigentlich gleichbedeutend mit anrufenPage.Context.Session
.MSDN erklärt, wie dies möglich ist:
Wenn Sie jedoch versuchen, innerhalb einer Klasse in App_Code auf diese Eigenschaft zuzugreifen, steht Ihnen die Eigenschaft nur zur Verfügung, wenn Ihre Klasse von der Seitenklasse abgeleitet ist.
Meine Lösung für dieses häufig auftretende Szenario besteht darin, dass ich niemals Seitenobjekte an Klassen übergebe . Ich würde lieber die erforderlichen Objekte aus der Seite Sitzung extrahieren und sie je nach Fall in Form einer Namens-Wert-Sammlung / Array / Liste an die Klasse übergeben.
quelle
Ich hatte den gleichen Fehler, weil ich versucht habe, Sitzungsvariablen innerhalb einer benutzerdefinierten Sitzungsklasse zu bearbeiten.
Ich musste den aktuellen Kontext (system.web.httpcontext.current) an die Klasse übergeben, und dann hat alles gut geklappt.
MA
quelle
Im asp.net-Kern funktioniert dies anders:
Quelle: https://benjii.me/2016/07/using-sessions-and-httpcontext-in-aspnetcore-and-mvc-core/
quelle
Dies sollte sowohl für die Anwendung als auch für den Entwickler effizienter sein.
Fügen Sie Ihrem Webprojekt die folgende Klasse hinzu:
Hier ist die Implementierung:
quelle