Как обрабатывать конец сеанса в global.asax?

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

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

Ответ 1

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

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

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

Ответ 2

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

protected void Session_End(Object sender, EventArgs e)
{
    // Remove user from HashTable
}

Ответ 3

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

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

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

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

Ответ 4

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