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

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

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

Ответ 1

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

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

Изменить

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

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

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

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

Ответ 2

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

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

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

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

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

[WebMethod (EnableSession = true)]

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

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

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

Ed

Ответ 3

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

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

public class MyAshxClass : IHttpHandler, IRequiresSessionState

Ответ 4

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

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

EDIT:

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

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

Ответ 5

В моем случае ASP.NET State Service был остановлен. Изменение Startup type на Automatic и запуск службы вручную в первый раз решили проблему.