2012-02-06 3 views
3

Я пытаюсь «войти в систему» ​​принудительно, когда пользователь неактивен и или сеанс закончился (либо бездействия, либо, что более важно, при закрытии браузера). Я не хочу использовать любое глупое решение AJAX для выполнения сообщения каждые несколько минут для «im alive» или вызова, когда браузер закрыт.Доступ к сеансу в конце?

У меня создалось впечатление, что если вы храните объект в сеансе и вы достигаете события Session_End, то вы не сможете получить доступ к чему-либо, хранящемуся в сеансе, по окончании его. Но из некоторых тестов, которые я сделал, похоже, что это, вероятно, последний шанс получить доступ к объекту.

Это может быть правдой? это надежный?

используя ASP.NET 4.0 здесь.

ответ

0

Для регистрации таймаута Вы можете использовать глобальные события для входа в таймаут. См. Эту ссылку для порядка событий http://www.techrepublic.com/article/working-with-the-aspnet-globalasax-file/5771721

+0

Спасибо, но вы полностью не поняли вопрос. Я не хочу использовать какие-либо javascript-таймеры, и я не просил ничего о том, чтобы изменить свойства тайм-аута сеанса/форм auth в config –

+0

извините, просто изменил это после публикации. см. пересмотренный ответ – PAULDAWG

3

Обычно делаются две вещи.

Во-первых, для клиента добавлен таймер javascript, а не как биение, а скорее как напоминание. Если они близки к завершению сеанса, тогда он просто говорит, что «сессия вот-вот закончится. Вы все еще там?» Если это так, то он делает «глупую» почту, чтобы обеспечить сохранение сеанса. Это чисто для ваших пользователей.

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

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

Буду ли я доверять session_end? Нет. Не 100%. Конечно, я бы ничего не помещал в объект сеанса, который потребовал бы, чтобы я доверял ему 100% в любом случае.

+0

Спасибо Крису. Хм. Я не хочу использовать какие-либо javascript-хаки или обратные вызовы. должно быть сделано на сервере полностью, если это возможно. Какой способ для меня «закрыть» пользователя в сеансе? Я хочу зарегистрировать время выхода пользователя из системы (кроме случаев, когда они удаляются в журнале. Когда сессия закончилась). Наличие сценария, выполняемого в бэкэнд для проверки каждого так часто, не дает вам указания, если на сайте была активность или нет для пользователя. –

+0

Действительно, все, что вы можете сделать, это * hope * session_end на самом деле работает. В тех случаях, когда это не так, вам понадобится серверная процедура очистки, которая отмечает пользователей как выходивших из системы. Чтобы поддержать это, вам нужно будет регистрировать каждый раз, когда они загружают страницу или другие действия на вашем сайте, чтобы убедиться, что вы не регистрируете людей, которые активно используют этот сайт. – NotMe

+1

Спасибо Крису. Я имею в виду, что из теста я сделал - каждую сессию я заканчивал. Я храню идентификатор пользователя в сеансе. Я играю вокруг сайта больше минуты, а сеанс не заканчивается. Когда я перестаю играть и эта метка минута, Session_End запускается, и я могу получить доступ к UserID в сеансе. Затем я могу делать то, что хочу здесь (чистку). Но для тех случаев, когда session_end не попадает, я думаю, что я мог бы ежедневно запускать SQL Job для обновления поля loggedOffAt с момента регистрации в + x минут. Мысли об этом? –

Смежные вопросы