web-dev-qa-db-fra.com

Quelle est la différence entre ces deux HttpContext.Current.Session et Session - asp.net 4.0

Quelle est la différence entre ces 2 morceaux de codes.

HttpContext.Current.Session["myvariable"]
Session["myvariable"]

asp.net 4.0 et C # 4.0

19
MonsterMMORPG

Ils sont effectivement les mêmes, en ce sens qu'ils accéderont aux mêmes données de session.

La raison pour laquelle vous pouvez appeler Session dans votre code-behind est que les pages ASP.Net étendent par défaut le type System.Web.UI.Page. Cela a une propriété publique Session. Si vous regardez le code correspondant à cela dans Reflector, vous verrez qu'il appelle simplement HttpContext.Current.Session lui-même (par le biais de sa propre propriété Context).

Dans d'autres classes, vous n'aurez pas accès à cette propriété, mais vous pourrez utiliser HttpContext.Current.Session pour accéder aux données de la session, à condition que vous l'exécutiez dans le contexte d'une application Web.

24
Kasaku

Sur un scénario standard, ils sont les mêmes. La différence est que la première instruction fonctionnera également dans des contextes statiques tels qu'un WebMethod.

8
Variant

Il y a une différence. Le second (Session) est une propriété de nombreux objets .NET, comme Page par exemple. Donc, vous ne pouvez pas y accéder, dans le constructeur de ces objets par exemple. Cependant, le premier (HttpContext.Current.Session) est toujours prêt et à votre disposition (bien sûr, une fois la session chargée dans le pipeline de traitement des demandes).

5
Saeed Neamati

Il n'y a pas de différence. Page.Session renvoie le HttpContext.Current.Session

Cela dit, j’ai écrit le fichier .dll qui sert d’extension pour les applications Web. Ces dll n'ont pas le concept de Session. Dans ces cas, je peux accéder à la session actuelle de l'application Web qui utilise mon fichier .dll en faisant référence à HttpContext.Current.Session.

3
James Hill

Il n'y a pas de différence. Ce sont les mêmes choses; la seconde forme est plus courte :)

2
Icarus

Il n'y a pas de différence de comportement. Si vous utilisez du code dans votre classe personnalisée pour laquelle HttpContext n'est pas directement disponible et souhaitez accéder à une valeur de session, la première ligne de code est utilisée, tandis que la deuxième ligne est utilisée lors de l'accès à des classes de contrôle ou de page.

2
Nps

Une autre réponse assez détaillée de Nicholas Carey https://stackoverflow.com/a/6021261/365017

"La propriété Session de HttpApplication présente un comportement différent de celui de la propriété HttpContext.Current.Session. Elles renverront toutes les deux une référence à la même instance HttpSessionState si elle est disponible. Elles diffèrent de ce qu’elles font quand il n’ya pas d’instance de HttpSessionState disponible. la demande en cours.

Tous les HttpHandlers ne fournissent pas l'état de session. Pour ce faire, HttpHandler doit implémenter [un ou les deux?] Les interfaces de marqueur IRequiresSessionState ou IReadOnlySessionState.

HttpContext.Current.Session retourne simplement null s'il n'y a pas de session disponible.

L'implémentation de la propriété Session par HttpApplication lève une exception HttpException avec le message L'état de session n'est pas disponible dans ce contexte. plutôt que de renvoyer une référence nulle. "

1
Steve G.

En interne, Page.Session pointe vers Il s'agit de HttpContext.Current.Session uniquement, mais il existe toujours deux différences en fonction de l'endroit où il est appelé.

Vous ne pouvez accéder à Page.Session qu'à partir de classes héritées de System.Web.UI.Page. Il générera une exception HttpException lors d'un accès à partir de WebMethod.
Where as HttpContext.Current.Session est accessible de n’importe où, à condition d’exécuter dans le contexte d’une application Web. 


Autre différence importante dans laquelle vous pouvez accéder à Page.Session mais ne pouvez pas accéder à HttpContext.Current.Session: 

S'il existe dans votre page une méthode nommée GetData (héritée de System.Web.UI.Page) exécutée simultanément dans différents threads d'une autre méthode de page, la méthode GetData peut accéder à la page Page.Seession, mais vous ne pouvez pas accéder à HttpContext.Current. .Session. 

C'est parce que GetData a été appelé à partir d'un thread différent, donc HttpContext.Current est nul et HttpContext.Current.Session lèvera une exception de référence nulle, mais Page.Session sera toujours attaché avec un objet de page afin que la méthode de page GetData puisse accéder à Page.Session.

0
Jay Shah