Разница между сессией и HttpContext.Current.Session - PullRequest
74 голосов
/ 02 июня 2009

В чем разница между Session и HttpContext.Current.Session объектом?

Ответы [ 4 ]

104 голосов
/ 16 мая 2011

Немного поздно здесь, но вот кое-что, что я только что обнаружил.

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

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

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

Реализация HttpApplication свойства Session выдает HttpException с сообщением Session state is not available in this context., а не возвращает ссылку null.

Некоторые примеры HttpHandler, которые не реализуют сеанс, являются обработчиками по умолчанию для обычно статических ресурсов, таких как изображения и файлы CSS. Любая ссылка на свойство HttpApplication Session в таких случаях (как в global.asax обработчиках событий) приведет к выбросу HttpException.

Излишне говорить, что неожиданный HttpException предоставляет WTF ?! момент, если вы этого не ожидаете.

Свойство Session класса HttpApplication реализовано следующим образом (из 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;
  }
}
8 голосов
/ 02 июня 2009

Разницы нет.

Получатель для Page.Session возвращает контекстную сессию.

2 голосов
/ 02 июня 2009

Ничего. Session просто указывает на HttpContext.Current.Session.

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

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

Page.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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...