Unterschied zwischen Session und HttpContext.Current.Session

77

Was ist der Unterschied zwischen Session und HttpContext.Current.Session-Objekt?

Bhaskar
quelle
3
Es ist klarstellbar, dass Sie sich bei der Aussage "Sitzung" auf System.Web.UI.Page.Session beziehen. Das Sitzungsobjekt ist im Kontext der ASP.NET-Seite verfügbar.
Llyle

Antworten:

111

Ein bisschen spät hier, aber hier ist etwas, das ich gerade entdeckt habe.

@Phillipe Leybaert und @CSharpAtl sind beide falsch. HttpApplicationDie SessionImmobilie zeigt ein anderes Verhalten als die Immobilie HttpContext.Current.Session. Beide geben einen Verweis auf dieselbe HttpSessionStateInstanz zurück falls einer verfügbar ist. Sie unterscheiden sich darin, was sie tun, wenn HttpSessionStatefür die aktuelle Anforderung keine Instanz verfügbar ist.

Nicht alle HttpHandlers bieten den Sitzungsstatus. Dazu HttpHandler muss der [eine oder beide?] Die Marker-Schnittstellen implementieren IRequiresSessionStateoderIReadOnlySessionState .

HttpContext.Current.Session kehrt einfach zurück null wenn keine Sitzung verfügbar ist.

Die HttpApplicationImplementierung der SessionEigenschaft durch wirft eine HttpExceptionNachricht mitSession state is not available in this context. anstatt eine nullReferenz zurückzugeben.

Einige Beispiele dafür, HttpHandlerdass keine Sitzung implementiert wird, sind die Standardhandler für normalerweise statische Ressourcen wie Bild- und CSS-Dateien. Jeder Verweis auf die Eigenschaft des HttpApplication's Sessionin solchen Fällen (wie in global.asaxEreignishandlern) führt dazu, dass ein HttpExceptionWurf ausgelöst wird.

Unnötig zu sagen, das Unerwartete HttpExceptionbietet eine WTF?! Moment, wenn Sie es nicht erwarten.

Die SessionEigenschaft der HttpApplicationKlasse wird folgendermaßen implementiert (von Reflector):

[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public HttpSessionState Session
{
  get
  {
    HttpSessionState session = null;

    if (this._session != null)
    {
        session = this._session;
    }
    else if (this._context != null)
    {
        session = this._context.Session;
    }

    if (session == null)
    {
        throw new HttpException(SR.GetString("Session_not_available"));
    }

    return session;
  }
}
Nicholas Carey
quelle
9
Vielen Dank, dass Sie sich die Mühe gemacht haben, eine bessere Antwort auszufüllen.
nicodemus13
12
Kein Problem. Ich hatte gerade eine ziemlich nervige WTF gehabt? Moment, der einige Zeit in Anspruch nahm, um zu klären. Ich dachte, ich würde es dokumentieren, damit nicht jemand anderes die Zeit damit verbringen müsste, herauszufinden, was los ist.
Nicholas Carey
8

Es gibt keinen Unterschied.

Der Getter für Page.Session gibt die Kontextsitzung zurück.

Philippe Leybaert
quelle
2

Nichts. Sessionzeigt nur auf die HttpContext.Current.Session.

CSharpAtl
quelle
1

Intern verweist Page.Session nur auf It's HttpContext.Current.Session, es gibt jedoch immer noch zwei Unterschiede, je nachdem, wo es aufgerufen wird.

Auf Page.Session kann nur von Klassen zugegriffen werden, die von System.Web.UI.Page geerbt wurden. Beim Zugriff über WebMethod wird eine HttpException ausgelöst.
Wobei als HttpContext.Current.Session von überall aus zugegriffen werden kann, solange Sie im Kontext einer Webanwendung ausgeführt werden.


Ein weiterer wichtiger Unterschied, bei dem Sie auf Page.Session zugreifen können, jedoch nicht auf HttpContext.Current.Session:

Wenn Ihre Seite eine Methode namens GetData enthält (von System.Web.UI.Page geerbt), die gleichzeitig in verschiedenen Threads von anderen ausgeführt wird Seitenmethode, GetData-Methode kann auf die Page.Seession zugreifen, Sie können jedoch nicht auf HttpContext.Current.Session zugreifen.

GetData wurde von einem anderen Thread aufgerufen, sodass HttpContext.Current null ist und HttpContext.Current.Session eine Nullreferenzausnahme auslöst, Page.Session jedoch wird weiterhin mit dem Seitenobjekt angehängt, damit die Seitenmethode GetData auf die Page.Session zugreifen kann.

Jay Shah
quelle