1

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

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

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

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

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

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

任何人都可以验证这一点吗?或者给我一个很好的资源来解释asp.net是如何管理这个的?

谢谢!

4

3 回答 3

1

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

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

于 2009-01-21T23:54:30.160 回答
1

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

我想我终于解决了这个问题。

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

在“InProc”或“StateServer”模式下,会话对象由缓存管理,其到期只能在未来进一步重置,但不能缩回到更当前的时间(否则将被忽略)。

于 2009-01-23T18:06:31.047 回答
0

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

于 2009-01-21T23:50:46.733 回答