В чем разница между сеансом и объектом HttpContext.Current.Session?
Разница между сеансом и HttpContext.Current.Session
Ответ 1
Немного поздно здесь, но вот что-то, что я только что обнаружил.
@Phillipe Leybaert и @CSharpAtl неверны. Свойство HttpApplication
Session
имеет другое поведение, чем свойство свойства HttpContext.Current.Session
. Они оба вернут ссылку на тот же HttpSessionState
экземпляр , если один из них доступен. Они отличаются тем, что они делают, когда нет экземпляра HttpSessionState, доступного для текущего запроса.
Не все HttpHandler
предоставляют состояние сеанса. Для этого HttpHandler
должен реализовать [один или оба?] Интерфейсы маркеров IRequiresSessionState
или IReadOnlySessionState
.
HttpContext.Current.Session
просто возвращает null
, если сеанс недоступен.
Реализация свойства Session HttpApplication
вызывает сообщение HttpException
с сообщением Session state is not available in this context.
, а не возвращает ссылку null
.
Некоторые примеры HttpHandlers, которые не реализуют сеанс, являются обработчиками по умолчанию для обычно статических ресурсов, таких как файлы изображений и 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;
}
}
Ответ 2
Нет никакой разницы.
Получатель для страницы. Сеанс возвращает контекстный сеанс.
Ответ 3
Ничего сеанса просто не указывает на текущий сеанс HttpContext.