ASP.Net - Как мы можем обновить строку в таблице базы данных, если браузер закрыт - PullRequest
0 голосов
/ 19 июля 2011

У меня есть приложение для веб-форм asp.net, которое использует модель сущностей. Когда пользователь входит в систему, мы создаем строку в таблице user_session с указанием времени. и когда пользователь выходит из системы, мы обновляем эту строку и устанавливаем таймаут.

Теперь проблема в том, что когда пользователь закрывает браузер без выхода из системы, как мы можем обновить строку в таблице user_session?

Ответы [ 6 ]

4 голосов
/ 19 июля 2011

Вы не можете.Сервер не может быть уведомлен о том, что клиент закрыл браузер.Лучшее, что вы можете сделать, - это запланировать какую-нибудь работу на вашем SQL Server, которая будет запускать и обновлять строки.Вы также можете попробовать подписаться на событие Session_End в Global.asax, но будьте осторожны, так как это событие может никогда не сработать, если вы используете сеанс вне процесса.

3 голосов
/ 19 июля 2011

Краткий ответ: вы не можете.Вот почему вы не должны пытаться делать такие глупости.

Более длинный ответ: вы должны смириться с задержкой ответа по истечении времени ожидания сеанса.Это может быть значительное количество времени.В Global.asax есть событие с именем Session_End, которое вы можете подключить, чтобы сделать то, что вы хотите ... но оно не будет отображаться, когда пользователь закрыл свой браузер.Он будет срабатывать только после окончания сеанса, который по умолчанию составляет 20 минут после последнего запроса.И это только в том случае, если это сеанс в памяти, и процесс не завершился сбоем.

Лучшее решение - просто периодически запускать задание, чтобы очистить таблицу пользователей в сети.Это решает проблему независимо, но требует больше работы для вашей работы, чтобы выяснить, что удалить.

1 голос
/ 19 июля 2011

Вы можете использовать Event Session_End в Global.asax.В зависимости от настроек сеанса может возникнуть задержка между закрытием браузера и фактическим временем ожидания сеанса на сервере.

1 голос
/ 19 июля 2011

В вашем Global.asax.cs вы можете закодировать это в событии Session_End.Это не произойдет до истечения времени ожидания сеанса (по умолчанию 20 минут), но это произойдет.Вы, вероятно, захотите удалить любые существующие записи по событиям Application_Start и / или Application_End (событие Application_End не выполняется при сбое компьютера или веб-процесса, поэтому лучше всего использовать Application_Start), чтобы убедиться, что вы начинаете заново, когда в Интернетеприложение загружает.

0 голосов
/ 07 января 2013

Попробуйте следующий код.

В событии form_load на каждой странице введите следующий код.

Response.AppendHeader("Refresh", "60; URL=../default.aspx")

Время ожидания сеанса по умолчанию составляет 20 минут, и я использую "60 "секунд для этой демонстрации.Если в этот период времени нет активности, то происходит возврат к странице по умолчанию или домашней странице, и мы отправляем ключ для обновления базы данных «ключ сеанса» или любой другой тег.Таким образом, мы можем узнать активность пользователя или участника.

Это сработало для меня.

0 голосов
/ 19 июля 2011

Полагаю, должна быть запланированная работа, которая закроет сеансы с истекшим сроком действия, как в AspState.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...