2009-06-02 5 views

Antwort

7

Es gibt keinen Unterschied.

Der Getter für Page.Session gibt die Kontext-Sitzung zurück.

1

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

94

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

@Phillipe Leybaert und @CSharpAtl sind beide falsch. HttpApplicationSession Eigenschaft zeigt ein anderes Verhalten als das der Eigenschaft HttpContext.Current.Session. Sie werden beide eine Referenz auf die gleiche HttpSessionState Instanz zurückgeben, wenn eins verfügbar ist. Sie unterscheiden sich in dem, was sie tun, wenn keine HttpSessionState Instanz für die aktuelle Anfrage verfügbar ist.

Nicht alle HttpHandler s bieten Sitzungsstatus. Um dies zu tun, muss die HttpHandler die Markerschnittstellen IRequiresSessionState oder IReadOnlySessionState implementieren [eines oder beide?].

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

Die HttpApplication ‚s Umsetzung der Session Eigenschaft löst eine HttpException mit der Nachricht Session state is not available in this context. anstatt eine null Referenz zurück.

Einige Beispiele für HttpHandler, die keine Sitzung implementieren, sind die Standardhandler für normalerweise statische Ressourcen, z. B. Bild- und CSS-Dateien. Jede Bezugnahme auf die HttpApplication Eigenschaft Session in solchen Fällen (wie in global.asax Event-Handler) wird eine HttpException geworfen werden.

Unnötig zu sagen, die unerwartete HttpException bietet eine WTF ?! Moment, wenn Sie es nicht erwarten.

Die Session Eigenschaft der HttpApplication Klasse wird so umgesetzt (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; 
    } 
} 
+6

Danke, dass Sie sich die Mühe gemacht haben, eine bessere Antwort zu geben. – nicodemus13

+7

Kein Problem. Ich hatte gerade einen ziemlich nervigen WTF? Moment, der etwas Zeit in Anspruch nahm. Ich dachte mir, ich würde es dokumentieren, damit jemand anderes auf der ganzen Linie nicht die Zeit damit verbringen müsste, herauszufinden, was vor sich geht. –

Verwandte Themen