2009-09-05 4 views
104

В моем веб-приложение, я сделать что-то вроде этого, чтобы прочитать переменные сессии:Что делать, если текущий сеанс ASP.NET равен NULL?

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

Я понимаю, почему это важно, чтобы проверить, почему HttpContext.Current.Session [ «MyVariable»] равно нулю (переменная не может были сохранены в сеансе или сеанс был сброшен по разным причинам), но почему мне нужно проверить, является ли 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? 
} 
+0

ASP.NET WebAPI будет иметь поведение с различным, вы можете проверить его на [Доступ к сеансу с помощью ASP.NET Web API] (http://stackoverflow.com/questions/9594229/accessing-session-using -asp-net-web-api? answertab = votes # tab-top) –

ответ

135

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

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

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

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

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

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

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

+4

Просто быстрое обновление, которое я нашел сегодня. Сессия недоступна в конструкторе страницы! Только на событии Init или после этого. –

+0

Я только что столкнулся с HttpContext.Current.Session == null - это код, вызываемый событием Page_Load главной страницы. По-видимому, это _can_ происходит в контексте страницы. Если я проверяю объект HttpContext.Current, большинство его элементов инициализируются, но CurrentNotification и IsPostNotification выдают ошибку: {System.PlatformNotSupportedException}. Какая бы ни была причина, эта проблема не возникала в производстве, где она работала годами. Платформа - это Windows Server 2003 R2 SP2, приложение имеет целевую структуру .Net 3.5 и работает в IIS с включенным состоянием сеанса. –

+0

Я также обнаружил, что, когда IIS подает прямой запрос на файл ресурсов, который существует на диске, например таблицу стилей, «HttpContext.Current.Session» может быть пустым для кода в «Application_AcquireRequestState». Однако запрос самой страницы делает доступным для этого объекта сеанса. Это, по крайней мере, под MVC.NET 4. –

2

ASP.NET Technical Articles

SUMMARY: In ASP.NET, every Web page derives from the System.Web.UI.Page class. The Page class aggregates an instance of the HttpSession object for session data. The Page class exposes different events and methods for customization. In particular, the OnInit method is used to set the initialize state of the Page object. If the request does not have the Session cookie, a new Session cookie will be issued to the requester.

EDIT:

Session: A Concept for Beginners

SUMMARY: Session is created when user sends a first request to the server for any page in the web application, the application creates the Session and sends the Session ID back to the user with the response and is stored in the client machine as a small cookie. So ideally the "machine that has disabled the cookies, session information will not be stored".

15

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

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

public class MyAshxClass : IHttpHandler, IRequiresSessionState 
+2

Работал для меня, используя скрипт Uploadify uploadify, спасибо. – Renan

+0

Большое спасибо, сессия была нулевой в моем классе входа. Когда я добавил этот код в мой обработчик ashx, он тоже стал сеансом на моем классе –

+0

. Я думаю, что это очень хорошо отвечает на вопрос. Спасибо. –

38

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

"So if you are calling other functionality, including static classes, from your page, you should be fine"

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

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

There’s a trick though, in order to access the session state within a web method, you must enable the session state management like so:

[WebMethod(EnableSession = true)]

By specifying the EnableSession value, you will now have a managed session to play with. If you don’t specify this value, you will get a null Session object, and more than likely run into null reference exceptions whilst trying to access the session object.

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

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

Ed

+1

спасибо Ed, Session появилось как null в веб-методе - добавив это исправленное. +1 – fusi

+1

Ну, когда вы звоните в веб-сервис, вы используете другой запрос, чем для страницы, так что инструкция по-прежнему правильная, ИМО. – driis

+0

Документы MSDN [здесь] (http://msdn.microsoft.com/en-us/library/byxd99hx%28v=vs.90%29.aspx#vbtskusingwebmethodattributeenablesession) - значение по умолчанию - false. Работает как шарм. – benjineer

Смежные вопросы