Как обработать конец сессии в global.asax? - PullRequest
10 голосов
/ 07 марта 2009

Я работаю в приложении чата, я использовал HashTable для хранения User и Operator в качестве ключа и объекта класса ChatRoom в качестве значения HashTable. Основная проблема заключается в том, что когда пользователь или оператор закрывают браузер или отключаются без выхода из системы, он автоматически выходит из системы по окончании сеанса.

Пожалуйста, помогите мне, связанным с этим и как использовать Global.asax в этом вопросе.

Ответы [ 4 ]

25 голосов
/ 07 марта 2009

Вы можете использовать событие завершения сеанса global.asax для удаления неожиданно отключенного пользователя:

void Session_End(Object sender, EventArgs E) {
    // Clean up session resources
}

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

14 голосов
/ 07 марта 2009

Добавьте файл Global.asax на свой веб-сайт, и в событии Session_End вы удалите пользователя из HashTable.

protected void Session_End(Object sender, EventArgs e)
{
    // Remove user from HashTable
}
7 голосов
/ 07 марта 2009

Событие Session_End не срабатывает, когда браузер закрыт, оно срабатывает, когда сервер не получил запрос от пользователя за определенное время (по умолчанию 20 минут). Это означает, что если вы используете Session_End для удаления пользователей, они будут оставаться в чате в течение 20 минут после закрытия браузера.

Я предлагаю вам сохранить время последнего запроса в объекте пользователя. Таким образом, вы можете определить, насколько активен пользователь и насколько вероятно, что он покинул чат. Например, вы можете показать любого пользователя, который ничего не делал в течение двух минут, неактивным.

Вы также можете разрешить приложению чата периодически опрашивать сервер (если вы этого еще не сделали). Это обновит время последнего запроса в объекте и сохранит пользователя живым, пока открыто окно чата.

Вы можете использовать событие onunload в браузере для отправки запроса на выход на сервер, когда пользователь покидает страницу. Это, конечно, работает, только если у пользователя все еще есть сетевое соединение. Событие onunload также запускается при перезагрузке страницы, поэтому вам придется отслеживать, почему событие запускается для его использования.

1 голос
/ 01 февраля 2011

Вы можете использовать JavaScript, который всегда запускается на клиенте и отправляет на сервер сигнал типа «Я здесь» Если следующий сигнал не приходит, вы можете позвонить Leave();. Я использовал для этого AJAX.

...