2009-06-02 7 views
69

Quelle est la différence entre l'objet Session et l'objet HttpContext.Current.Session?Différence entre Session et HttpContext.Current.Session

+2

Il convient de préciser que lorsque vous dites « session », vous faites référence à System.Web.UI.Page.Session . L'objet Session est disponible dans le contexte de la page ASP.NET. – Llyle

Répondre

7

Il n'y a pas de différence.

Le getter pour Page.Session renvoie la session de contexte.

1

Rien. Session pointe seulement sur HttpContext.Current.Session.

94

Un peu en retard ici, mais voici quelque chose que je viens de découvrir.

@Phillipe Leybaert et @CSharpAtl sont tous deux incorrects. La propriété Session présente un comportement différent de celui de la propriété HttpContext.Current.Session. Ils renverront tous deux une référence à la même HttpSessionState instance si est disponible. Ils diffèrent dans ce qu'ils font lorsqu'il n'y a aucune instance de HttpSessionState disponible pour la requête en cours.

Tous les HttpHandler ne fournissent pas l'état de session. Pour ce faire, le HttpHandlerdoit mettre en œuvre [une ou les deux?] Les interfaces de marqueur IRequiresSessionState ou IReadOnlySessionState.

HttpContext.Current.Session renvoie simplement null s'il n'y a aucune session disponible.

La mise en œuvre de HttpApplication de la propriété Session lève une HttpException avec le message Session state is not available in this context. plutôt que de retourner une référence null.

Certains exemples de HttpHandler qui n'implémentent pas de session sont les gestionnaires par défaut pour les ressources normalement statiques, telles que les fichiers image et CSS. Toute référence à la propriété Session de HttpApplication dans de tels cas (comme dans les gestionnaires d'événements global.asax) entraînera le lancement d'un HttpException.

Inutile de dire que le HttpException inattendu fournit un WTF ?! moment si vous ne vous y attendez pas.

La propriété Session de la classe HttpApplication est mis en œuvre ainsi (du réflecteur):

[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

Merci de mettre l'effort pour remplir une meilleure réponse. – nicodemus13

+7

Pas de problème. Je venais juste d'avoir une WTF plutôt agaçante? moment qui a pris un certain temps pour régler. Je me suis dit que je le documenterais afin que quelqu'un d'autre n'ait pas à passer le temps à comprendre ce qui se passait. –

Questions connexes