应用程序在Application_AcquireRequestState事件处理程序中设置session.timeout。
会话到期前,会弹出通知窗口。它通过Application_AcquireRequestState将会话超时重置为3分钟(通常为30分钟)。
通知为用户提供了将会话延长30分钟的选项。如果用户单击“是”,它将通过上一个事件处理程序重置会话超时30分钟。
问题是,虽然用户单击是,并且会话超时设置正确,但会话似乎在设置的时间之前超时。这只发生在通知之后。
怀疑是当它到达Application_AcquireRequestState时,已经为此请求计算了超时。新的超时值将用于下一个请求。因此,当用户单击“是”以扩展会话时,由于通知窗口设置的超时,当前请求的超时距离不是30分钟,距离仅3分钟。只有在用户发送另一个请求时,“是”才会生效。
(通知窗口有自己的计时对象)
任何人都可以验证吗?或者指出一个很好的资源来解释asp.net如何管理它?
谢谢!
答案 0 :(得分:1)
Session.Timeout是应用程序中的全局设置。
如果您在弹出窗口时将用户Timeout设置为3分钟,通知用户他们即将退出,并且他们没有响应,则Session.Timeout将保持三分钟直到另一个用户重置它 - 有可能发生这种情况吗?
答案 1 :(得分:1)
Zhaph,问题是当用户点击“是”延长会话时,然后走开。
我想我终于找到了解决问题的方法。
这是我所怀疑的,但仅限于“SQLServer”模式。当请求进入Application_AcquireRequestState时,会话已经扩展(可以在ASPState数据库,ASPStateTempSessions表中验证)。如果用户单击“是”,虽然设置了新的超时值,但在下一次服务器请求之前它不会生效。如果用户在没有再次单击的情况下离开,则会话超时使用先前设置的超时值,即3分钟。
在“InProc”或“StateServer”模式下,会话对象由缓存管理,缓存的到期时间可以在将来进一步复位,但不会缩减回更多当前时间(或者将被忽略)。
答案 2 :(得分:0)
我使用更简单的机制。我没有弹出窗口扩展会话。我使用带有滑动窗口的会话,当用户在会话过期通知中单击“确定”按钮时,它会向服务器发出一个AJAX请求,更新滑动窗口。