В моем веб-приложении я делаю что-то вроде этого, чтобы прочитать переменные сеанса:
if (HttpContext.Current.Session != null && HttpContext.Current.Session["MyVariable"] != null)
{
string myVariable= (string)HttpContext.Current.Session["MyVariable"];
}
Я понимаю, почему важно проверить, почему HttpContext.Current.Session ["MyVariable"] имеет значение null (возможно, переменная еще не была сохранена в сеансе или сеанс был сброшен по разным причинам), но зачем мне это проверять если 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?
}
Ответы:
Да, объект Session может быть нулевым, но только в определенных обстоятельствах, с которыми вы редко будете сталкиваться:
Если у вас есть только код на страницах, вы не столкнетесь с этим. Большая часть моего кода ASP .NET использует сеанс без повторной проверки нулевого значения. Однако есть над чем подумать, если вы разрабатываете IHttpModule или иным образом не разбираетесь в более сложных деталях ASP .NET.
редактировать
В ответ на комментарий: Доступно ли состояние сеанса, зависит от того, было ли выполнено событие AcquireRequestState для запроса. Здесь модуль состояния сеанса выполняет свою работу, считывая файл cookie сеанса и находя для вас подходящий набор переменных сеанса.
AcquireRequestState запускается до передачи управления вашей странице. Так что, если вы вызываете со своей страницы другие функции, включая статические классы, все будет в порядке.
Если у вас есть классы, выполняющие логику инициализации во время запуска, например, в событии Application_Start или с помощью статического конструктора, состояние сеанса может быть недоступно. Все сводится к тому, есть ли текущий запрос и был ли запущен AcquireRequestState.
Кроме того, если клиент отключил файлы cookie, объект сеанса все равно будет доступен, но при следующем запросе пользователь вернется с новым пустым сеансом. Это связано с тем, что клиенту дается пакет состояния сеанса, если у него его еще нет. Если клиент не передает cookie сеанса, у нас нет возможности идентифицировать клиента как того же самого, поэтому ему снова и снова будет передаваться новый сеанс.
источник
HttpContext.Current.Session
может иметь значение null для кода в Application_AcquireRequestState. Однако запрос самой страницы делает объект сеанса доступным для кода. По крайней мере, это под MVC.NET 4.Следующее утверждение не совсем верно:
Я вызываю статический метод, который ссылается на сеанс через HttpContext.Current.Session, и он имеет значение NULL. Однако я вызываю этот метод через метод веб-службы через ajax, используя jQuery.
Как я узнал здесь, вы можете решить проблему с помощью простого атрибута метода или использовать объект сеанса веб-службы:
Спасибо Мэтью Козье за решение.
Просто подумал, что добавлю свои два цента.
издание
источник
the default value is false
. Работает как шарм.Если ваш экземпляр Session имеет значение null и вы находитесь в файле 'ashx', просто реализуйте интерфейс IRequiresSessionState.
Этот интерфейс не имеет членов, поэтому вам просто нужно добавить имя интерфейса после объявления класса (C #):
источник
Технические статьи по ASP.NET
РЕДАКТИРОВАТЬ:
Сессия: Концепция для начинающих
источник
В моем случае
ASP.NET State Service
было остановлено. ИзменениеStartup type
кAutomatic
и запуску службы вручную в первый раз решается вопрос.источник