在Session_Start会话超时后立即调用ASP.NET Session_End

时间:2009-03-30 15:59:50

标签: asp.net session-timeout

我有Session_Start和Session_End事件的处理程序。当我第一次启动应用程序时,一切正常。如果我离开会话并发生标准超时,我会看到我的Session_End抛出。我期待那种行为。

但是,我说,我会在超时后回来并刷新页面。 Session_Start方法运行,但随后立即运行Session_End方法。我期待在Session_Start和Session_End之间再闲置15分钟。

会出现什么问题?

编辑:是的,相同的会话ID。

编辑2:Cookie看起来应该在会话结束时到期。不知道为什么我一直得到Session_Start / Session_End这个循环。我也试过从Session_End调用Session.Abandon(),但是没有用。这也是在ASP.NET开发服务器上运行的。我还没有在真正的IIS服务器上试过它。

5 个答案:

答案 0 :(得分:4)

回答有点迟,但对于遇到同样问题的其他用户可能会有用..我遇到了与您见过的相同的行为:Session_Start()Session_End()被调用对于第一次超时后的每个请求,SessionID始终相同:

  1. 我在ASP.NET 4.0中运行相同的代码,问题就消失了。

  2. 作为ASP.NET 2.0 / 3.5中的一种解决方法,只需在会话集合中放置任何内容(Session["dummy"] = "dummy"),Session_Start()Session_End()将正常运行。

答案 1 :(得分:1)

.Net使用会话cookie做一些时髦的事情,尤其是。与Forms auth一起使用。我只是猜测,但我认为客户端挂在cookie上,并且即使在无效之后将其重新发送到服务器,这(我猜这里)可能会触发重启会话,此时它识别出它的无效并将其删除,从而导致会话结束。

尝试:

  1. 确保您的Cookie设置为正常过期
  2. 调用Session.Abandon()和FormsAuthentication.SignOut()
  3. 不确定这是否有帮助,但是FWIW。

答案 2 :(得分:1)

对于有同样问题的人。 Alex B给出的答案救了我。

这不再发生在4.0上,但是如果你在Session_Start处理程序中的Session中添加了一些内容,那么会切断Session_Start - > Session_End圈,您甚至不必删除cookie。

答案 3 :(得分:0)

您是否可以验证事件是否针对相同的会话ID触发?

答案 4 :(得分:0)

这是此question的副本。

这是因为ASP.NET 2.0 / 3.5根据是否正在使用会话来处理会话。在正常情况下,它不会尝试在第一次使用会话之前保持会话,因此不会发出会话cookie(如果它不存在)。第一次使用 会话时,会在服务器上创建会话并发布会话cookie。

现在,当前一个会话重新启动但未使用时,ASP.NET会有点困惑。它会尝试立即放弃未使用的(重新启动的)会话,因为它不需要,这会引发早期的Session_End。但是,它不会删除预先存在的会话cookie,因此每个后续请求都会重复序列,重新启动然后终止会话,直到删除cookie或使用会话为止。

在.Net 4.0中,此行为已更改,并且在这种情况下事件不再触发。