Как узнать, что сеанс закончился, когда sessionState! = InProc

Я хотел бы иметь состояние сеанса в отдельном процессе для моего приложения, но я также хотел бы, чтобы некоторый код запускался всякий раз, когда сеанс пользователя завершается. (изменение строки состояния, которая указывает, находятся ли они в сети или нет, и уменьшение количества онлайн-пользователей.)

Если состояние моего сеанса - InProc в веб-конфигурации, я могу использовать метод Session_End для запуска этого кода, но как мне это сделать, если нет?


person NetHawk    schedule 23.06.2009    source источник
comment
если это касается ASP.NET MVC, проверьте здесь stackoverflow.com/questions/1490879/   -  person DmitryBoyko    schedule 10.01.2014


Ответы (4)


Вы используете состояние SQL или службу сервера состояний IIS?

Если вы используете состояние SQL, вы можете просто проверить идентификатор пользователя. Когда время сеанса истекает, строка удаляется и все.

Если вы используете службу сервера состояний IIS, прямого метода выполнения кода на Session_End или чего-либо подобного не существует. Прости.

person Jonathan    schedule 23.06.2009

Есть немного принципа неопределенности при попытке определить, когда сеанс истек. Запрашивая сервер, чтобы узнать, жив ли он (с помощью AJAX или аналогичного), вы фактически поддерживаете его в рабочем состоянии, что обычно является прямо противоположным поведением, которое вы хотите.

Обычно я делаю это путем встраивания кода javascript на страницу. :

var sessionTimeout = 20; //minutes - set this programmatically server-side based on your configured timout interval
setTimeout('timeoutAlert()', (sessionTimeout + 1) * 1000 * 60); //we add one minute buffer because this is an inaccurate process and we want to make sure they are actually timed out before we attempt to redirect
function timeoutAlert()
{
    alert("Your sesssion has ended, you will now be redirect to the login page.");
    document.location = '/home.aspx';
}

Обратите внимание, что этот timeoutAlert () может изменять некоторую клиентскую часть HTML, запускать некоторый AJAX для выполнения кода на стороне сервера, что бы вам ни требовалось. Вам нужно будет быть осторожным, чтобы отменить и сбросить setTimeout, если вы делаете какие-либо вызовы на сервер (например, через AJAX) после того, как страница будет отрисована.

person D'Arcy Rittich    schedule 23.06.2009

Вы не можете назначить обработчик событий, который всегда будет запускаться при завершении сеанса. Существуют приближения, такие как назначение обработчика событий событию End сеанса InProc (которое будет запускаться только в случае нормального завершения сеанса) или изменение процедуры DeleteExpiredSessions для сеанса SQL Server.

person yfeldblum    schedule 23.06.2009

Если вы используете SQL Server, то вы можете изменить хранимую процедуру DeleteExpiredSessions для выполнения своей работы (т.е. уменьшить количество пользователей в сети).

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

Вы также можете поставить проверку javascript, чтобы узнать, закрылся ли браузер или, если была нажата кнопка выхода и т. Д., Затем выполнить вызов ajax, чтобы вручную закрыть сеанс.

person Russ Bradberry    schedule 23.06.2009