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



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



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

4 ответов:

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

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

Edit

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

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

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

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

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

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

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

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

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

[WebMethod (EnableSession = true)]

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

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

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

Эд

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

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

public class MyAshxClass : IHttpHandler, IRequiresSessionState

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

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

EDIT:

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

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

Comments

    Ничего не найдено.