Как я знаю, когда сессия закончилась когда sessionState! = InProc - PullRequest
1 голос
/ 23 июня 2009

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

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

Ответы [ 4 ]

1 голос
/ 23 июня 2009

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

1 голос
/ 23 июня 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) после отображения страницы.

1 голос
/ 23 июня 2009

Используете ли вы SQL State или IIS State Server Service?

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

Если вы используете IIS State Server Service, прямого метода выполнения кода на Session_End или чем-либо подобном нет. К сожалению.

0 голосов
/ 23 июня 2009

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

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

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

...