Что делать, если ток ASP.NET сеанс равен null?

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

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

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

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

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?
}

4 ответов


да, Объект сеанса может быть null, но только в определенных обстоятельствах, с которыми вы будете редко сталкиваться:

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

редактировать

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

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

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

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


следующее утверждение не совсем точно:

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

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

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

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

[атрибутом webmethod(EnableSession = истина)]

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

спасибо Мэтью козье за решение.

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

Эд


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

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

public class MyAshxClass : IHttpHandler, IRequiresSessionState

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

резюме: в ASP.NET, каждая Веб-страница происходит от системы.Сеть.ПОЛЬЗОВАТЕЛЬСКИЙ ИНТЕРФЕЙС.Страница класс. Класс Page объединяет экземпляр объекта HttpSession для данные сеанса. Класс Page предоставляет различные события и методы настройка. В частности, Метод OnInit используется для установки инициализировать состояние объекта Page. Если запрос не имеет Сессионные куки, новый cookie сеанса будет выдаются просителю.

EDIT:

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

сводка: сеанс создается, когда пользователь посылает первый запрос на сервер для любой страницы веб-приложения, приложение создает сеанс и отправляет идентификатор сеанса обратно в пользователь с ответом и сохраняется в клиентской машине как небольшой печенье. Так что в идеале " машина, которая отключил куки, сессии информация не будет храниться".