Обращение к сессии из класса, не являющимся Page
От: sheich  
Дата: 23.09.08 08:18
Оценка:
Имеется .aspx страница, при загрузке которой в её методе Page_Load происходит присваивание значений некоторым переменным объекта Сессия:
    protected void Page_Load(object sender, EventArgs e)
    {
        Session["login"] = "value";
    }

Далее, мне нужно из некоторого другого класса, который описывается в отдельном файле узнать содержимое этой переменной сессии.
такой:
    string s = (string)Session["login"];

и такой:
    string s = (string)System.Web.HttpContext.Session["login"];

способы приводят к ошибке NullReferenceException
при этом ссылка на модуль System.Web в заголовках присутствует.

Попытался сделать следующее:
В коде серверной части моей .aspx страницы (CodeFile который) создаю еще один класс (в добавок к тому, который включает метод Page_Load и который указан в "Inherits" клиентской части страницы):
    public class Test
    {
        public string SessionLogin()
        {
            return (string)HttpContext.Current.Session["login"];
        }

    }

Теперь, по идее, при создании объекта класс Test я могу обратиться к его свойству SessionLogin и узнать, таким образом, текущее значение сессии "login". Так вот, в чем загвоздка: если я пишу:
    string s = new Test().SessionLogin();

в теле главного класса самой страницы — это срабатывает, значение переменной сессии я вижу.
Когда же я перехожу на страницу, не являющуюся веб-формой и которая взаимодействует с веб-сервером (а тот, в свою очередь с БД) через AJAX -> WCF сервис и в момент вот этого обращения страницы через AJAX в классе, выполняющим соединение с БД пытаюсь вызвать тот же самый метод класса Test — опять получаю исключение NullReferenceException (в строке HttpContext.Current.Session["login"]). Хотя вот эта переменная сессии точно уже существует на тот момент, потому что я это проверил на предыдущей странице.

Вопрос: как сделать так, что бы сессия была видна за пределами Page?
Re: Обращение к сессии из класса, не являющимся Page
От: Аlexey  
Дата: 23.09.08 08:32
Оценка:
Здравствуйте, sheich, Вы писали:

S>поскипано


Попробуйте применить интерфейс-маркер IRequiresSessionState.
Re[2]: Обращение к сессии из класса, не являющимся Page
От: sheich  
Дата: 23.09.08 08:57
Оценка:
А>Попробуйте применить интерфейс-маркер IRequiresSessionState.

Как класс, от которого наследуется мой сторонний класс?
типа:

    public class Data : IRequiresSessionState
    {
        public string s() 
        {
            return new Test().SessionLogin();
        }
    }

?
Re[3]: Обращение к сессии из класса, не являющимся Page
От: Аlexey  
Дата: 23.09.08 09:01
Оценка:
Здравствуйте, sheich, Вы писали:

А>>Попробуйте применить интерфейс-маркер IRequiresSessionState.


S>Как класс, от которого наследуется мой сторонний класс?

S>типа:

S>
S>    public class Data : IRequiresSessionState
S>    {
S>        public string s() 
S>        {
S>            return new Test().SessionLogin();
S>        }
S>    }
S>

S>?

Этим интерфейсом надо помечать класс-обработчик запроса.
Re[4]: Обращение к сессии из класса, не являющимся Page
От: sheich  
Дата: 23.09.08 09:07
Оценка:
А>Этим интерфейсом надо помечать класс-обработчик запроса.

то есть тот класс, который содержит метод, возвращающий значение сессии?
Re[4]: Обращение к сессии из класса, не являющимся Page
От: sheich  
Дата: 23.09.08 09:12
Оценка:
А>Этим интерфейсом надо помечать класс-обработчик запроса.

попробовал, не помогло.

    public class Test : IRequiresSessionState
        {
        public string SessionLogin()
            {
            return (string)HttpContext.Current.Session["login"];
            }
        }


Все равно NullReferenceException
Re[5]: Обращение к сессии из класса, не являющимся Page
От: Аlexey  
Дата: 23.09.08 09:31
Оценка:
Здравствуйте, sheich, Вы писали:

Сразу не обратил внимание что у вас WCF-сервис. Насколько я знаю из WCF-сервиса не получится обратиться к ASP.Net сессии.
Re[4]: Обращение к сессии из класса, не являющимся Page
От: sheich  
Дата: 23.09.08 09:31
Оценка:
А>Этим интерфейсом надо помечать класс-обработчик запроса.

пробовал дебажить.
в момент обращения от стороннего класса
вместо
HttpContext.Current = {System.Web.HttpContext}

я получаю
HttpContext.Current = null

(это в детальном описании исключения, которое дает Visual Studio)
то есть ругается она именно на часть HttpContext.Current
даже не доходит до Session
Re[6]: Обращение к сессии из класса, не являющимся Page
От: sheich  
Дата: 23.09.08 09:37
Оценка:
А>Сразу не обратил внимание что у вас WCF-сервис. Насколько я знаю из WCF-сервиса не получится обратиться к ASP.Net сессии.

Это только к WCF относится? Что насчет .asmx сервисов?

Кстати, у WCF есть какие то свои сессии, задающиеся таким образом:
    [ServiceContract(Namespace = "myspace", SessionMode = SessionMode.Allowed)]


получается, что эти сессии не имеют никакого отношения к ASP.Net сессиям?
Re[7]: Обращение к сессии из класса, не являющимся Page
От: Аlexey  
Дата: 23.09.08 09:45
Оценка: 12 (2)
Здравствуйте, sheich, Вы писали:

А>>Сразу не обратил внимание что у вас WCF-сервис. Насколько я знаю из WCF-сервиса не получится обратиться к ASP.Net сессии.


S>Это только к WCF относится? Что насчет .asmx сервисов?


S>Кстати, у WCF есть какие то свои сессии, задающиеся таким образом:

S>
S>    [ServiceContract(Namespace = "myspace", SessionMode = SessionMode.Allowed)]
S>


S>получается, что эти сессии не имеют никакого отношения к ASP.Net сессиям?


Да это другая сессия. Но для совместимости предусмотрен дополнительный параметр.

<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled=”true”/>
</system.serviceModel>

Re[8]: Обращение к сессии из класса, не являющимся Page
От: sheich  
Дата: 23.09.08 10:05
Оценка:
А>Да это другая сессия. Но для совместимости предусмотрен дополнительный параметр.
А>

А><system.serviceModel>
А> <serviceHostingEnvironment aspNetCompatibilityEnabled=”true”/>
А></system.serviceModel>


Да! Я тоже нашел. Вобщем, спасибо.
Резюме такое: для совместимости WCF с ASP-сессиями надо в web.config добавить этот параметр:
<serviceHostingEnvironment aspNetCompatibilityEnabled=”true”/>

и еще в кода самого сервиса:
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]

сразу все заработало
теперь, когда этот вариант заработал, мне надо решить другое: что будет работать быстрее:
сессии в режиме совместимости или cookies?
Re[9]: Обращение к сессии из класса, не являющимся Page
От: sheich  
Дата: 23.09.08 10:27
Оценка:
на всякий случай http://vincenthomedev.wordpress.com/2008/03/29/accessing-aspnet-session-request-response-httpcontext-httpapplication-in-wcf/
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.