web-dev-qa-db-de.com

Wie kann von einer Klasse in ASP.NET auf Sitzungsvariablen zugegriffen werden?

Ich habe in meiner Anwendung eine Klassendatei im Ordner App_Code erstellt. Ich habe eine Sitzungsvariable 

Session["loginId"]

Ich möchte auf diese Sitzungsvariablen in meiner Klasse zugreifen, aber wenn ich die folgende Zeile schreibe, wird ein Fehler angezeigt

Session["loginId"]

Kann mir jemand sagen, wie auf Sitzungsvariablen innerhalb einer Klasse zugegriffen wird, die im Ordner app_code in ASP.NET 2.0 (C #) erstellt wird.

149
Prashant

(Der Vollständigkeit halber aktualisiert)
Sie können mit Session["loginId"] von jeder Seite oder Steuerung aus auf Sitzungsvariablen und mit System.Web.HttpContext.Current.Session["loginId"]. von jeder Klasse (z. B. innerhalb einer Klassenbibliothek) zugreifen.

Bitte lesen Sie weiter für meine ursprüngliche Antwort ...


Ich verwende immer eine Wrapper-Klasse für 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 Ihnen den typsicheren Zugriff auf Ihre Sitzungseigenschaften von einer beliebigen Klasse aus, z. B. wie folgt:

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 in Ihrer Anwendung keine hart codierten Sitzungsschlüssel verwenden (z. B. Sitzung ["loginId"]).
  • sie können Ihre Sitzungselemente dokumentieren, indem Sie den Eigenschaften von MySession XML-Dokumentkommentare hinzufügen
  • sie können Ihre Sitzungsvariablen mit Standardwerten initialisieren (beispielsweise sicherstellen, dass sie nicht null sind).
347
M4N

Greifen Sie auf die Sitzung über die Threads HttpContext zu: -

HttpContext.Current.Session["loginId"]
99
AnthonyWJones

Das Problem mit der vorgeschlagenen Lösung besteht darin, dass einige in SessionState integrierte Leistungsfunktionen beschädigt werden können, wenn Sie einen Out-of-Process-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 SessionState, nur das zu deserialisieren, was nur erforderlich ist, wenn die Variable beim ersten Aufruf derererialisiert wird, und nur die geänderten Variablen werden erneut serialisiert und ersetzt. Wenn Sie über eine Menge von Sitzungsvariablen verfügen und sie alle in eine Klasse einordnen, 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, da die Klasse geändert wurde. Nur etwas zu beachten, wenn Sie eine Menge Sitzung und einen Oop-Modus verwenden.

22
Ernie

Die vor meinen Antworten gegebenen Antworten bieten passende Lösungen für das Problem. Ich denke jedoch, dass es wichtig ist zu verstehen, warum dieser Fehler auftritt:

Die Session-Eigenschaft der Page gibt eine Instanz des Typs HttpSessionState relativ zu dieser bestimmten Anforderung zurück. Page.Session entspricht tatsächlich dem Aufruf von Page.Context.Session.

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

Da ASP.NET-Seiten einen Standardverweis auf den System.Web-Namespace (der die HttpContext-Klasse enthält) enthalten, können Sie die Mitglieder von HttpContext auf einer ASPX-Seite ohne den vollständig qualifizierten Klassenverweis auf HttpContext referenzieren.

Wenn Sie jedoch versuchen, auf diese Eigenschaft innerhalb einer Klasse in App_Code zuzugreifen, ist die Eigenschaft für Sie nicht verfügbar, sofern Ihre Klasse nicht von der Seitenklasse abgeleitet ist.

Meine Lösung für dieses oft anzutreffende Szenario ist, dass ich übergebe niemals Seitenobjekte an Klassen. Ich würde die benötigten Objekte lieber aus der Seite Session extrahieren und sie in Form einer Name-Value-Collection/Array/List an die Klasse übergeben, je nach Fall.

12
Cerebrus

Ich hatte den gleichen Fehler, weil ich versuchte, 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 funktioniert.

MA

1
Munawar Ali

In asp.net core funktioniert das anders:

public class SomeOtherClass
{
    private readonly IHttpContextAccessor _httpContextAccessor;
    private ISession _session => _httpContextAccessor.HttpContext.Session;

    public SomeOtherClass(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }

    public void TestSet()
    {
        _session.SetString("Test", "Ben Rules!");
    }

    public void TestGet()
    {
        var message = _session.GetString("Test");
    }
}

Quelle: https://benjii.me/2016/07/gebrauchs-sessions-and-httpcontext-in-aspnetcore-and-mvc-core/

0
Matty

Dies sollte sowohl für die Anwendung als auch für den Entwickler effizienter sein.

Fügen Sie Ihrem Webprojekt die folgende Klasse hinzu:

/// <summary>
/// This holds all of the session variables for the site.
/// </summary>
public class SessionCentralized
{
protected internal static void Save<T>(string sessionName, T value)
{
    HttpContext.Current.Session[sessionName] = value;
}

protected internal static T Get<T>(string sessionName)
{
    return (T)HttpContext.Current.Session[sessionName];
}

public static int? WhatEverSessionVariableYouWantToHold
{
    get
    {
        return Get<int?>(nameof(WhatEverSessionVariableYouWantToHold));
    }
    set
    {
        Save(nameof(WhatEverSessionVariableYouWantToHold), value);
    }
}

}

Hier ist die Implementierung:

SessionCentralized.WhatEverSessionVariableYouWantToHold = id;
0
Captain America