В чем разница между этими двумя HttpContext.Current.Session и Session - asp.net 4.0 - PullRequest
19 голосов
/ 31 октября 2011

В чем разница между этими двумя кодами.

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

asp.net 4.0 и C # 4.0

Ответы [ 8 ]

25 голосов
/ 31 октября 2011

Они фактически одинаковы в том смысле, что они получат доступ к одним и тем же данным сеанса.

Причина, по которой вы можете вызвать Session в своем коде, заключается в том, что ASP.Netстраницы по умолчанию расширяют тип System.Web.UI.Page.Это Session публичная собственность.Если вы посмотрите на код для этого в Reflector, вы увидите, что он просто вызывает HttpContext.Current.Session сам (через свое собственное свойство Context).

В других классах у вас не будет доступа к этому свойству, новместо этого вы можете использовать HttpContext.Current.Session для доступа к данным сеанса, если вы работаете в контексте веб-приложения.

8 голосов
/ 31 октября 2011

По стандартному сценарию они одинаковы.Разница в том, что первый оператор также будет работать в статических контекстах, таких как WebMethod.

5 голосов
/ 31 октября 2011

Есть разница.Второй (Session) - это свойство многих объектов .NET, например, Page.Таким образом, вы не можете иметь к нему доступ, например, в конструкторе этих объектов.Однако первый (HttpContext.Current.Session) всегда готов и в вашем распоряжении (разумеется, после загрузки сеанса в конвейер обработки запросов).

3 голосов
/ 31 октября 2011

Разницы нет.Page.Session возвращает HttpContext.Current.Session

С учетом сказанного, я написал .dll, которые служат расширениями для веб-приложений.Эти .dll не имеют понятия Session.В этих случаях я могу получить доступ к текущему сеансу веб-приложения, использующего мой .dll, ссылаясь на HttpContext.Current.Session

2 голосов
/ 31 октября 2011

Нет различий в поведении.Если вы используете код в своем пользовательском классе, где HttpContext недоступен напрямую и хотите получить доступ к значению сеанса, тогда мы используем первую строку кода, а вторая - при доступе к классам Page или control.

2 голосов
/ 31 октября 2011

Нет никакой разницы. Это одно и то же; вторая форма короче:)

1 голос
/ 29 апреля 2012

Еще один довольно подробный ответ от Николая Кэри https://stackoverflow.com/a/6021261/365017

"Свойство HttpApplication Session демонстрирует иное поведение, чем свойство протокола HttpContext.Current.Session. Они оба возвращают ссылку на один и тот же экземпляр HttpSessionState, если он доступен. Они отличаются тем, что они делают, когда нет экземпляра HttpSessionState доступен для текущего запроса.

Не все HttpHandlers предоставляют состояние сеанса. Для этого HttpHandler должен реализовать [один или оба?] Маркерных интерфейса IRequiresSessionState или IReadOnlySessionState.

HttpContext.Current.Session просто возвращает ноль, если сеанс недоступен.

Реализация HttpApplication свойства Session создает исключение HttpException с сообщением, что состояние Session недоступно в этом контексте. вместо возврата пустой ссылки. "

0 голосов
/ 27 декабря 2018

Внутренне, Page.Session указывает на Это Только HttpContext.Current.Session, но есть два отличия в зависимости от того, откуда он вызывается.

СтраницаДоступ к .Session возможен только из классов, унаследованных от System.Web.UI.Page, и он вызывает исключение HttpException при доступе из WebMethod.
Где доступ к HttpContext.Current.Session возможен из любого места, пока вы работаете вконтекст веб-приложения.


Другое важное отличие, когда вы можете получить доступ к Page.Session, но не можете получить доступ к HttpContext.Current.Session:

Если на вашей странице есть метод с именем GetData (унаследованный от System.Web.UI.Page), который выполняется одновременно в разных потоках от какого-либо другого метода страницы, метод GetData может обращаться к Page.Seession, но вы не можете получить доступ к HttpContext.Current.Session.

Это потому, что GetData был вызван из другого потока, поэтому HttpContext.Current имеет значение null, а HttpContext.Current.Session сгенерирует исключение нулевой ссылки, но Page.Session все равно будет присоединен к объекту страницы, так что метод страницы GetData может получить доступPage.Session.

...