ASP.NET会话超时后,Session_End会在Session_Start之后立即调用吗?

3
我已经为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个回答

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
我刚刚看到了相同的问题。虽然我不确定你的解决方法,因为我们始终会为每个创建的会话存储某些内容。我读到过如果您的会话完全为空,则Session_End将不会触发[http://www.vikramlakhotia.com/Mystries_of_when_does_Session_End_event_fires_in_AspNet.aspx]。[在我的情况下,页面上有一个点击处理程序,它向服务器发出AJAX请求-如果这有所不同的话] - Chris Fewtrell
你们不使用 Session_StartSession_End 来计算用户数量吗?WebFarm。有完整的源代码示例吗? - PreguntonCojoneroCabrón

1
.Net在处理Session cookies时有些奇怪的事情,尤其是与Forms auth一起使用时。我只是猜测,但我认为客户端可能会保留cookie,并在它无效后重新发送给服务器,这(我在这里猜测)可能会触发会话重启,此时它会识别出自己无效并将其销毁,导致会话结束。
尝试以下方法:
  1. 确保你的cookies正常过期
  2. 调用Session.Abandon()和FormsAuthentication.SignOut()
不确定这是否有帮助,但供参考。

1

对于遇到同样问题的人。

Alex B 给出的答案救了我一命。

在 4.0 版本中,这种情况不再发生,但是如果你在 Session_Start 处理程序中放置了某些内容,则会打断 Session_Start -> Session_End 循环,甚至无需删除 cookies。


0

这是一个问题的副本。

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

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

在.Net 4.0中,这种行为已经改变,事件在这种情况下不再触发。


0

你能验证这些事件是否针对同一个会话ID触发吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接