kastaneda
@kastaneda

HttpContext.Current.Session?

Здравствуйте. Не так давно столкнулся с непонятной проблемой на сайте — имеется asp.net mvc проект, есть single-tone класс SiteUser, через которого осуществляется вся работа с сервисами.

при успешной авторизации текущий юзер сохраняется в коллекции сессии:



  1. static readonly string sessionKey = «SiteUser»;
  2.  
  3. public static SiteUser Create()  
  4. {  
  5.     SiteUser.Current = new SiteUser();  
  6.  
  7.     return SiteUser.Current;
  8. }  
  9.  
  10. public static SiteUser Current  
  11. {  
  12.     get  
  13.     {  
  14.         if (HttpContext.Current.Session == null || HttpContext.Current.Session[sessionKey] == null)  
  15.         {  
  16.             throw new SiteUserAutorizationExeption();  
  17.         }
  18.  
  19.         return HttpContext.Current.Session[sessionKey] as SiteUser;  
  20.     }
  21.     set
  22.     {
  23.         if (!HttpContext.Current.Session == null)
  24.         {
  25.             HttpContext.Current.Session[sessionKey] = value;
  26.         }
  27.     }  
  28. }


Все работает, но иногда (sic!) срабатывает исключение по второму условию, т.е.
  1. HttpContext.Current.Session[sessionKey] == null
— при этом сессия является активной, FormsAuthenticationTicket не просрочен.

Добавляет головоломки тот факт, что в коллекциях сессии также лежат еще, к примеру, настройки культуры, которые не обнуляются. Понятно, что нигде по коду не происходит принудительного обнуления Session[sessionKey].

Возможно кто-то сталкивался, подскажите, что можно попробовать/посмотреть/исправить?



p.s. настройки сессии в web.config:

  1. <sessionState mode=«InProc» timeout=«20» />




update:

как подсказали в комментариях, сначала я тоже подумал, что это просто умирает сессия, и попробовал хранить продолжительности сессии и логировал изменение переменных — но SessionEnd себя так и не проявил :-( а если и проявлял, то по тому таймауту, что прописан в web.config



так вот. вчера вечером я скачал symbol-таблицы исходников .net framework, расставил брейкпоинты на изменение коллекции в недрах HttpContext (SessionStateItemCollection) и стал ждать, кликать… но баг больше не проявлялся, я решил поставить таймаут на минуту, чтобы посмотреть что происходит с сессией и коллекцией — вскрытие показало несколько вещей:

1) NULL принимают все элементы коллекции, просто настройки культуры быстро и ловко себя возвращают обратно

2) обнуление происходит при завершении сессии, что очевидно



в принципе, теперь хотя бы понятно, что удаляется не просто один элемент коллекции сессии, а вся сессия целиком. но все равно непонятно, почему она позволяет себе себя так вести, ведь в web.config указаны 20 минут
  • Вопрос задан
  • 8765 просмотров
Пригласить эксперта
Ответы на вопрос 1
Да, наверное, сильно не помогу, но посоветую элементарное логирование. Первое это Session_Start и Session_End методы и инкапсулировать запись/чтение/удаление значений из сессии и логировать все действия. Надеюсь кто то предложит более конструктивное решение.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы