Событие ASP.NET Session_End не запускается
Я пытаюсь заставить транзакцию базы данных выполняться, когда заканчивается сеанс ASP.NET (в простом приложении WebForms на Windows 2008 Server). Я понимаю, что многие респонденты будут предлагать не полагаться на событие Session_End (как я прочитал в сотне постов на эту тему по запросу Google). Пожалуйста, порадуйте меня.
Я сделал эти вещи:
Включено состояние сеанса в web.config:
<sessionState mode="InProc" cookieless="false" timeout="1" />
Подтвердил, что событие Session_End НЕ срабатывает, когда я вызываю Session.Abandon() ИЛИ, когда время сеанса истекло.
Подтвердил, что сеанс истекает через 1 минуту (как настроено выше).
Подтверждено, что я не пытаюсь получить доступ к каким-либо объектам Request или Response или Server (что, как я понимаю, приведет к сбою).
РЕДАКТИРОВАТЬ: Я также подтвердил, что я храню данные в сеансе - я использую несколько переменных сеанса для хранения различных точек данных, и они создаются, когда пользователь входит в приложение.
РЕДАКТИРОВАТЬ: Я также подтвердил, что я не создаю сеанс, а затем отказываюсь от него в том же запросе. Как отмечалось выше, проблема существует, даже когда время сеанса истекло (т.е. запрос не сделан).
Пожалуйста помоги!
4 ответа
Если вы ничего не сохраните в сеансе, session_end не сработает. Если вы сохраняете данные в сеансе в первом запросе и вызываете метод отмены в том же запросе, session_end также не будет запущен.
Надеюсь это поможет!
T
Для других, которые ищут решение и не находят ответа на этот вопрос, я видел случай, когда проект Global.asax был определен с кодом, на который ссылается файл, но события были определены в asax вместо файла.cs.
В этом случае он будет запускать Session_Start, но не Session_End, как если бы он смотрел в указанном файле.cs.
Удалив ссылку на код файла, Session_End начал запускаться, как и ожидалось.
Выясняется, что событие было запущено, но выполняемый код молча выдавал ошибку, так как я не получал должного доступа к объекту Application и некоторым из моих классов App_Code (что я до сих пор не знаю, как сделать, но стоит отдельного вопроса переполнения стека).
Попробуйте инициализировать сеанс из того же метода, который запрашивает базу данных. Сделайте это, прежде чем запрашивать базу данных.