Здравствуйте. Не так давно столкнулся с непонятной проблемой на сайте — имеется asp.net mvc проект, есть single-tone класс SiteUser, через которого осуществляется вся работа с сервисами.
при успешной авторизации текущий юзер сохраняется в коллекции сессии:
- static readonly string sessionKey = «SiteUser»;
-
- public static SiteUser Create()
- {
- SiteUser.Current = new SiteUser();
-
- return SiteUser.Current;
- }
-
- public static SiteUser Current
- {
- get
- {
- if (HttpContext.Current.Session == null || HttpContext.Current.Session[sessionKey] == null)
- {
- throw new SiteUserAutorizationExeption();
- }
-
- return HttpContext.Current.Session[sessionKey] as SiteUser;
- }
- set
- {
- if (!HttpContext.Current.Session == null)
- {
- HttpContext.Current.Session[sessionKey] = value;
- }
- }
- }
Все работает, но иногда (sic!) срабатывает исключение по второму условию, т.е.
- HttpContext.Current.Session[sessionKey] == null
— при этом сессия является активной, FormsAuthenticationTicket не просрочен.
Добавляет головоломки тот факт, что в коллекциях сессии также лежат еще, к примеру, настройки культуры, которые не обнуляются. Понятно, что нигде по коду не происходит принудительного обнуления Session[sessionKey].
Возможно кто-то сталкивался, подскажите, что можно попробовать/посмотреть/исправить?
p.s. настройки сессии в web.config:
- <sessionState mode=«InProc» timeout=«20» />
update:
как подсказали в комментариях, сначала я тоже подумал, что это просто умирает сессия, и попробовал хранить продолжительности сессии и логировал изменение переменных — но SessionEnd себя так и не проявил :-( а если и проявлял, то по тому таймауту, что прописан в web.config
так вот. вчера вечером я скачал symbol-таблицы исходников .net framework, расставил брейкпоинты на изменение коллекции в недрах HttpContext (SessionStateItemCollection) и стал ждать, кликать… но баг больше не проявлялся, я решил поставить таймаут на минуту, чтобы посмотреть что происходит с сессией и коллекцией — вскрытие показало несколько вещей:
1) NULL принимают все элементы коллекции, просто настройки культуры быстро и ловко себя возвращают обратно
2) обнуление происходит при завершении сессии, что очевидно
в принципе, теперь хотя бы понятно, что удаляется не просто один элемент коллекции сессии, а вся сессия целиком. но все равно непонятно, почему она позволяет себе себя так вести, ведь в web.config указаны 20 минут