Где установить время ожидания сеанса? - PullRequest
1 голос
/ 22 января 2009

Приложение устанавливает session.timeout в обработчике события Application_AcquireRequestState.

До истечения сеанса появляется окно с уведомлением. Он сбрасывает время ожидания сеанса, скажем, до 3 минут (обычно это 30 минут) через Application_AcquireRequestState.

Уведомление предлагает пользователю возможность продлить сеанс еще на 30 минут. Если пользователь нажимает «да», он сбрасывает время ожидания сеанса на 30 минут с помощью предыдущего обработчика событий.

Проблема заключается в том, что, хотя пользователь нажимает «Да» и время ожидания сеанса установлено правильно, время сеанса, по-видимому, превышает заданное время. Это происходит только после уведомления.

Подозрение, что когда оно достигает Application_AcquireRequestState, время ожидания для этого запроса уже рассчитано. Новое значение тайм-аута будет использовано для следующего запроса. Поэтому, когда пользователь нажимает «Да», чтобы продлить сеанс, время ожидания для текущего запроса составляет не 30 минут, а всего 3 минуты, из-за времени ожидания, установленного в окне уведомлений. Да будет действовать, только если пользователь отправит другой запрос.

(Окно уведомлений имеет собственный объект синхронизации)

Кто-нибудь может это проверить? или укажите мне хороший ресурс, чтобы объяснить, как asp.net управляет этим?

Спасибо!

Ответы [ 3 ]

1 голос
/ 22 января 2009

Session.Timeout - это глобальный параметр в приложении.

Если вы устанавливаете тайм-аут пользователей на 3 минуты, когда вы открываете окно, уведомляющее пользователя о том, что он собирается выйти из системы, и они не отвечают, ваш Session.Timeout останется на три минуты, пока другой пользователь сбрасывает его - возможно ли, что это происходит?

1 голос
/ 23 января 2009

Zhaph, проблема в том, что когда пользователь нажал «Да», чтобы продлить сеанс, а затем ушел.

Я думаю, что наконец-то решил проблему.

Это было, как я и подозревал, но только в режиме "SQLServer". Когда запрос поступает в Application_AcquireRequestState, сеанс уже расширяется (может быть проверено в базе данных ASPState, таблице ASPStateTempSessions). Если пользователь нажал «Да», хотя новое значение времени ожидания установлено, оно не будет действовать до следующего запроса к серверу. Если пользователь ушел без другого щелчка, время сеанса истекло с ранее установленным значением времени ожидания, которое составляет 3 минуты.

В режиме «InProc» или «StateServer» объекты сеанса управляются кэшем, срок действия которого может быть сброшен только в будущем, но не сокращаться до более текущего времени (или оно будет игнорироваться).

0 голосов
/ 22 января 2009

Я использую гораздо более простой механизм. У меня нет всплывающего окна продлить сеанс вообще. Я использую сеанс со скользящим окном, и когда пользователь нажимает кнопку «ОК» в уведомлении об истечении сеанса, он отправляет запрос AJAX обратно на сервер, обновляя скользящее окно.

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