我有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服务器上试过它。
答案 0 :(得分:4)
回答有点迟,但对于遇到同样问题的其他用户可能会有用..我遇到了与您见过的相同的行为:Session_Start()
和Session_End()
被调用对于第一次超时后的每个请求,SessionID始终相同:
我在ASP.NET 4.0中运行相同的代码,问题就消失了。
作为ASP.NET 2.0 / 3.5中的一种解决方法,只需在会话集合中放置任何内容(Session["dummy"] = "dummy"
),Session_Start()
和Session_End()
将正常运行。
答案 1 :(得分:1)
.Net使用会话cookie做一些时髦的事情,尤其是。与Forms auth一起使用。我只是猜测,但我认为客户端挂在cookie上,并且即使在无效之后将其重新发送到服务器,这(我猜这里)可能会触发重启会话,此时它识别出它的无效并将其删除,从而导致会话结束。
尝试:
不确定这是否有帮助,但是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中,此行为已更改,并且在这种情况下事件不再触发。