在哪里设置会话超时?

时间:2009-01-21 23:28:27

标签: asp.net session timeout

应用程序在Application_AcquireRequestState事件处理程序中设置session.timeout。

会话到期前,会弹出通知窗口。它通过Application_AcquireRequestState将会话超时重置为3分钟(通常为30分钟)。

通知为用户提供了将会话延长30分钟的选项。如果用户单击“是”,它将通过上一个事件处理程序重置会话超时30分钟。

问题是,虽然用户单击是,并且会话超时设置正确,但会话似乎在设置的时间之前超时。这只发生在通知之后。

怀疑是当它到达Application_AcquireRequestState时,已经为此请求计算了超时。新的超时值将用于下一个请求。因此,当用户单击“是”以扩展会话时,由于通知窗口设置的超时,当前请求的超时距离不是30分钟,距离仅3分钟。只有在用户发送另一个请求时,“是”才会生效。

(通知窗口有自己的计时对象)

任何人都可以验证吗?或者指出一个很好的资源来解释asp.net如何管理它?

谢谢!

3 个答案:

答案 0 :(得分:1)

Session.Timeout是应用程序中的全局设置。

如果您在弹出窗口时将用户Timeout设置为3分钟,通知用户他们即将退出,并且他们没有响应,则Session.Timeout将保持三分钟直到另一个用户重置它 - 有可能发生这种情况吗?

答案 1 :(得分:1)

Zhaph,问题是当用户点击“是”延长会话时,然后走开。

我想我终于找到了解决问题的方法。

这是我所怀疑的,但仅限于“SQLServer”模式。当请求进入Application_AcquireRequestState时,会话已经扩展(可以在ASPState数据库,ASPStateTempSessions表中验证)。如果用户单击“是”,虽然设置了新的超时值,但在下一次服务器请求之前它不会生效。如果用户在没有再次单击的情况下离开,则会话超时使用先前设置的超时值,即3分钟。

在“InProc”或“StateServer”模式下,会话对象由缓存管理,缓存的到期时间可以在将来进一步复位,但不会缩减回更多当前时间(或者将被忽略)。

答案 2 :(得分:0)

我使用更简单的机制。我没有弹出窗口扩展会话。我使用带有滑动窗口的会话,当用户在会话过期通知中单击“确定”按钮时,它会向服务器发出一个AJAX请求,更新滑动窗口。