Приложение устанавливает session.timeout в обработчике событий Application_AcquireRequestState.
Перед истечением сеанса появляется всплывающее окно с уведомлением. Он сбрасывает тайм-аут сеанса, скажем, до 3 минут (обычно это 30 минут) с помощью Application_AcquireRequestState.
Уведомление предлагает пользователю возможность продлить сеанс еще на 30 минут. Если пользователь нажимает «Да», он сбрасывает тайм-аут сеанса на 30 минут с помощью предыдущего обработчика событий.
Проблема в том, что хотя пользователь нажимает «Да» и время ожидания сеанса установлено правильно, время ожидания сеанса превышает установленное время. Это происходит только после уведомления.
Подозрение в том, что когда он попадает в Application_AcquireRequestState, тайм-аут уже рассчитан для этого запроса. Новое значение тайм-аута будет использовано для следующего запроса. Таким образом, когда пользователь нажимает «Да», чтобы продлить сеанс, тайм-аут для текущего запроса составляет не 30 минут, а всего 3 минуты из-за тайм-аута, установленного окном уведомления. Да будет действовать только в том случае, если пользователь отправит другой запрос.
(Окно уведомлений имеет собственный объект времени)
Кто-нибудь может это проверить? или укажите мне хороший ресурс, чтобы объяснить, как asp.net справляется с этим?
Спасибо!





Я использую гораздо более простой механизм. У меня вообще нет всплывающего окна для продления сеанса. Я использую сеанс со скользящим окном, и когда пользователь нажимает кнопку «ОК» в уведомлении об истечении срока действия сеанса, он отправляет запрос AJAX обратно серверу, обновляя скользящее окно.
Session.Timeout - это глобальный параметр в приложении.
Если вы устанавливаете время ожидания пользователей на 3 минуты, когда вы открываете окно, уведомляющее пользователя о том, что они собираются выйти из системы, и они не отвечают, ваш Session.Timeout будет оставаться на уровне трех минут, пока другой пользователь не сбросит его - возможно ли, что это происходит?
Жап, проблема в том, что пользователь нажимал «Да», чтобы продлить сеанс, а затем уходил.
Думаю, я наконец решил проблему.
Как я и подозревал, но только в режиме "SQLServer". Когда запрос поступает в Application_AcquireRequestState, сеанс уже расширен (можно проверить в базе данных ASPState, таблице ASPStateTempSessions). Если пользователь нажал «Да», несмотря на то, что установлено новое значение тайм-аута, оно не вступит в силу до следующего запроса сервера. Если пользователь ушел, не щелкнув еще раз, время сеанса истекло с ранее установленным значением тайм-аута, которое составляет 3 минуты.
В режиме «InProc» или «StateServer» объекты сеанса управляются кешем, срок действия которого может быть сброшен только в будущем, но не сокращен до более текущего времени (или он будет проигнорирован).