2009-03-07 6 views
143

Ich habe eine Klassendatei im App_Code-Ordner in meiner Anwendung erstellt. Ich habe eine Session-VariableWie auf Sitzungsvariablen von beliebiger Klasse in ASP.NET zugegriffen wird?

Session["loginId"] 

Ich möchte in meiner Klasse dieser Session-Variablen zuzugreifen, aber wenn ich die folgende Zeile schreibe dann gibt es Fehler

Session["loginId"] 

Kann mir jemand sagen, wie Sitzung zugreifen Variablen innerhalb einer Klasse, die in app_code Ordner in ASP.NET 2.0 (C#)

Antwort

331

(aktualisiert auf Vollständigkeit)
Sie Session-Variablen von einer beliebigen Seite oder Steuerung zugreifen können Session["loginId"] und aus jeder Klasse (z.B. aus dem Inneren einer Klassenbibliothek), mit System.Web.HttpContext.Current.Session["loginId"].

Aber bitte auf meine ursprüngliche Antwort lesen ...


ich immer eine Wrapper-Klasse um die Sitzung ASP.NET verwenden, um Zugriff auf Session-Variablen 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, Ihre Sitzungseigenschaften in einem typsicher aus jeder Klasse Art und Weise zuzugreifen, zum Beispiel wie folgt aus:

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 Ihnen viel Typ-Casting
  • Sie müssen hart codierte Sitzungsschlüssel in Ihrer Anwendung nicht verwenden (z Session [ „loginId“]
  • Sie Ihre Sitzung Artikel durch Hinzufügen von XML-doc-Kommentare zu den Eigenschaften von MySession
  • dokumentieren können Sie Ihre Session-Variablen mit Standardwerten initialisieren können (zB versichern sie sind nicht null)
+0

Hallo, wir müssen Code für Get und Set schreiben, oder? "public int LoginId {get; set;}" – Prashant

+0

Ich habe es geschrieben wie: get {return Convert.ToString (HttpContext.Current.Session ["webm_login"]); } set {HttpContext.Current.Session ["webm_login"] = Wert; } – Prashant

+0

Ist es richtig für get und set ??? – Prashant

96

Zugriff auf die Session über die Themen Httpcontext erstellt: -

HttpContext.Current.Session["loginId"] 
+0

Vielen Dank Anthony für diesen einfachen Schritt. – Kings

+0

Vielen Dank Anthony, + 1 dafür –

+0

Danke. Vergessen, was der Namespace war :) –

12

die Antworten präsentiert vor meinen apt-Lösungen für das Problem, aber ich glaube, dass es wichtig ist, zu verstehen, warum dieser Fehler auf:

die Session Eigenschaft des Page eine Instanz vom Typ HttpSessionState in Bezug auf diese bestimmte Anforderung zurückgibt. Page.Session entspricht tatsächlich dem Aufruf Page.Context.Session.

MSDN erklärt, wie dies möglich ist:

Da ASP.NET-Seiten einen Standard Verweis auf den Namespace System.Web enthalten (die die HttpContext Klasse enthält), können Sie die Mitglieder des HttpContext auf eine referenzieren. aspx-Seite ohne den vollständig qualifizierten Klassenverweis auf HttpContext.

jedoch Wenn Sie versuchen, diese Eigenschaft zuzugreifen innerhalb einer Klasse in App_Code, wird das Objekt nicht zur Verfügung stehen, es sei denn Ihre Klasse von der Seite Klasse ableitet.

Meine Lösung für dieses häufig anzutreffende Szenario ist, dass ich Seitenobjekte nie an Klassen übergeben. Ich würde lieber die erforderlichen Objekte aus der Seitensitzung extrahieren und sie je nach Fall in Form einer Name-Wert-Sammlung/Array/Liste an die Klasse übergeben.

+0

Das ist eine gute Erklärung, es hat mir geholfen, +1 für das :) –

22

Das Problem mit der vorgeschlagenen Lösung besteht darin, dass einige Leistungsfunktionen, die in SessionState integriert sind, unterbrochen werden können, wenn Sie einen prozessexternen Sitzungsspeicher verwenden. (entweder "State Server Mode" oder "SQL Server Mode"). In OOP-Modi müssen die Sitzungsdaten am Ende der Seitenanforderung serialisiert und zu Beginn der Seitenanforderung deserialisiert werden, was kostspielig sein kann. Um die Leistung zu verbessern, versucht der SessionState nur das Deserialisieren, was nur von der Deserialisierungsvariablen benötigt wird, wenn er das erste Mal aufgerufen wird, und es serialisiert und ersetzt nur Variablen, die geändert wurden. Wenn Sie viele Sitzungsvariablen haben und sie alle in eine Klasse schieben, wird im Wesentlichen alles in Ihrer Sitzung bei jeder Seitenanforderung, die Sitzung verwendet, deserialisiert und alles muss erneut serialisiert werden, auch wenn nur eine Eigenschaft geändert wurde, weil die Klasse geändert wurde. Nur etwas zu beachten, wenn Sie eine Menge Session und einen Oop-Modus verwenden.

+3

+1 für diese Sache. Wenn Sie InProc für Session nicht verwenden, ist Ernie zu 100% korrekt. InProc ist ohnehin sehr eingeschränkt, da es Webfarms nicht unterstützt und verloren geht, wenn die Anwendung neu gestartet wird. Beachten Sie, dass wir bei Performance-Kosten eine Prämie von 20% beim Einsatz des State Server-Modus anstreben und zusätzlich Serialisierungskosten hinzufügen. Wie Sie sich vorstellen können, kann dies teuer werden. Sie können einen Teil des Serialisierungsaufwands vermeiden, indem Sie sich an primitive Typen halten (z. B. int, string, char, byte usw.). Benutzerdefinierte Objekte werden mit der Serialisierung konfrontiert. Benutzer Vorsicht. –

+0

+1 Guter Punkt. Eine Änderung, die die beiden Konzepte miteinander verbinden würde, wäre, dass jede Eigenschaft dieser benutzerdefinierten "Sitzungs" -Klasse die asp.net-Sitzung selbst statt eines großen Objekts in der Sitzung aufruft. Müssen die Art Casting tun, die @ M4N Ansatz vermeidet, aber vielleicht lohnt es sich, wenn Sie nur einige der Sitzung jedes Mal lesen. – eol

1

Ich hatte den gleichen Fehler, weil ich versuchte, Sitzungsvariablen in einer benutzerdefinierten Session-Klasse zu manipulieren.

Ich musste den aktuellen Kontext (system.web.httpcontext.current) in die Klasse übergeben, und dann hat alles gut geklappt.

MA

Verwandte Themen