Что делать, если текущий 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?
}
4 ответов:
да, Объект сеанса может быть null, но только в определенных обстоятельствах, с которыми вы редко столкнетесь:
- Если вы отключили вручную http-модуля, отключение сеансов в целом
- Если ваш код выполняется до HttpApplication.AcquireRequestState событие.
- ваш код работает в IHttpHandler, что не указывает ни на IRequiresSessionState или IReadOnlySessionState интерфейс.
Если у вас есть только кода на страницах, вы не столкнетесь с этим. Большая часть моего кода 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
резюме: In ASP.NET, каждая Веб-страница выводится из системы.Сеть.ПОЛЬЗОВАТЕЛЬСКИЙ ИНТЕРФЕЙС.Страница класс. Класс страницы агрегирует экземпляр объекта HttpSession для данные сеанса. Класс страницы предоставляет различные события и методы для настройка. В частности, Метод OnInit используется для установки инициализировать состояние объекта страницы. Если запрос не имеет Сессионные куки, новый cookie сеанса будет выдаются запрашивающему лицу.
EDIT:
сессия: концепция для начинающих
сводка: сеанс создается, когда пользователь посылает первый запрос на сервер для любой страницы в веб-приложении, приложение создает сеанс и отправляет идентификатор сеанса обратно в пользователь с ответом и сохраняется в клиентской машине как маленький печенье. Так что в идеале " машина, которая отключил куки, сессии информация не будет храниться".
Comments