Что мне делать, если текущий сеанс ASP.NET равен нулю?

98

В моем веб-приложении я делаю что-то вроде этого, чтобы прочитать переменные сеанса:

if (HttpContext.Current.Session != null &&  HttpContext.Current.Session["MyVariable"] != null)
{
    string myVariable= (string)HttpContext.Current.Session["MyVariable"];
}

Я понимаю, почему важно проверить, почему HttpContext.Current.Session [ "MyVariable" ] равно null (переменная, возможно, еще не была сохранена на сеансе или сеанс был reset по разным причинам), но почему мне нужно проверить, является ли HttpContext.Current.Session нулевым?

Я понимаю, что сеанс автоматически создается ASP.NET, поэтому HttpContext.Current.Session никогда не должен быть нулевым. Правильно ли это предположение? Если оно может быть нулевым, значит ли это, что я должен также проверить его, прежде чем хранить что-то в нем:

if (HttpContext.Current.Session != null)
{
    HttpContext.Current.Session["MyVariable"]="Test";
}
else
{
    // What should be done in this case (if session is null)?
    // Is it possible to force the session to be created if it doesn't exist?
}
  • 0
    ASP.NET WebApi будет работать по-разному, вы можете проверить его при доступе к сеансу с помощью ASP.NET Web API
Теги:
session

4 ответа

139
Лучший ответ

Да, объект Session может быть нулевым, но только в определенных обстоятельствах, на которые вы будете редко встречаться:

Если у вас есть только код на страницах, вы не столкнетесь с этим. Большая часть моего кода ASP.NET использует сеанс без повторной проверки значения null. Однако следует подумать о том, разрабатываете ли вы IHttpModule или иначе находитесь в более мрачных деталях ASP.NET.

Изменить

В ответ на комментарий: Доступно или нет состояние сеанса зависит от того, запущено ли событие AcquireRequestState для запроса. Здесь модуль состояния сеанса работает, читая куки файл сеанса и находя подходящий набор переменных сеанса для вас.

Запуск AcquireRequestState до того, как управление будет передано вашей странице. Поэтому, если вы вызываете другие функции, включая статические классы, со своей страницы, вы должны быть в порядке.

Если у вас есть несколько классов, выполняющих логику инициализации во время запуска, например, в событии Application_Start или при использовании статического конструктора, состояние сеанса может быть недоступно. Все это сводится к тому, есть ли текущий запрос, и был запущен AcquireRequestState.

Кроме того, если клиент отключил куки файлы, объект Session все равно будет доступен, но при следующем запросе пользователь вернется с новым пустым сеансом. Это связано с тем, что клиенту предоставляется сумка состояний сеанса, если у него его еще нет. Если клиент не переносит куки файл сеанса, мы не можем идентифицировать клиента как одно и то же, поэтому он будет снова и снова получать новый сеанс.

  • 5
    Просто быстрое обновление, которое я нашел сегодня. Сессия недоступна на странице конструктора! Только на событии Init или после этого.
  • 0
    Я только что столкнулся с HttpContext.Current.Session == нулевым кодом, вызываемым событием Page_Load главной страницы. По-видимому, это может происходить в контексте страницы. Если я проверяю объект HttpContext.Current, большинство его членов инициализируются, но CurrentNotification и IsPostNotification выдают ошибку: {System.PlatformNotSupportedException}. Безотносительно причины эта проблема не возникла в производстве, где это бежало в течение многих лет. Платформа - Windows Server 2003 R2 с пакетом обновления 2 (SP2), приложение имеет целевую платформу .Net 3.5 и работает в IIS с включенным состоянием сеанса.
Показать ещё 1 комментарий
36

Следующий оператор не совсем точен:

"Итак, если вы вызываете другие функции, включая статические классы, со своей страницы, вы должны быть в порядке"

Я вызываю статический метод, который ссылается на сеанс через HttpContext.Current.Session и он равен нулю. Тем не менее, я вызываю метод через метод webservice через ajax, используя jQuery.

Как я узнал здесь, вы можете исправить проблему с помощью простого атрибута метода или использовать объект сеанса веб-службы:

Тем не менее, для доступа к состоянию сеанса в веб-методе необходимо включить управление состоянием сеанса следующим образом:

[WebMethod (EnableSession = true)]

Задав значение EnableSession, теперь у вас будет управляемый сеанс. Если вы не укажете это значение, вы получите нулевой объект Session и, скорее всего, перейдете в нулевые ссылочные исключения, пытаясь получить доступ к объекту сеанса.

Благодаря Мэтью Козье для решения.

Просто подумал, что добавлю два цента.

Ed

  • 1
    спасибо Эд, сессия в webmethod выглядела как нулевая - добавление это исправило. +1
  • 1
    Ну, когда вы звоните в веб-сервис, вы используете другой запрос, чем для страницы, так что это утверждение по-прежнему правильно, IMO.
Показать ещё 2 комментария
15

Если ваш экземпляр сеанса имеет значение null и ваш файл "ashx", просто выполните интерфейс "IRequiresSessionState".

В этом интерфейсе нет элементов, поэтому вам нужно просто добавить имя интерфейса после объявления класса (С#):

public class MyAshxClass : IHttpHandler, IRequiresSessionState
  • 2
    Работал у меня, используя скрипт загрузки Uploadify, спасибо.
  • 0
    Спасибо большое, сессия была нулевой в моем классе входа в систему. Когда я добавил этот код в свой обработчик ashx, он тоже перешел на мой класс
Показать ещё 2 комментария
2

Технические статьи ASP.NET

РЕЗЮМЕ: в ASP.NET каждая веб-страница происходит из System.Web.UI.Page класс. Класс страницы объединяет экземпляр объекта HttpSession для данные сеанса. Класс страницы выставляет различные события и методы для настройки. В частности, Метод OnInit используется для установки инициализировать состояние объекта Page. Если запрос не имеет Сессия cookie, новый сеансовый файл cookie будет выдано запрашивающему лицу.

EDIT:

Сессия: концепция для начинающих

РЕЗЮМЕ: сеанс создается, когда пользователь отправляет первый запрос на сервер для любой страницы в веб-приложении, приложение создает сеанс и отправляет идентификатор сеанса обратно в пользователь с ответом и сохраняется в клиентской машине как небольшой печенье. В идеале это "машина, которая отключил файлы cookie, сеанс информация не будет сохранена".

Ещё вопросы

Сообщество Overcoder
Наверх
Меню