我想在会话超时时注销用户。所以在Global.asax中使用了以下代码:
protected void Session_End(object sender, EventArgs e)
{
FormsAuthentication.SignOut();
}
但似乎session_end
永远不会开火。任何想法如何解决它?我正在使用ASP.NET默认设置。
答案 0 :(得分:41)
您可以在Session_Start中设置一些会话数据。如果没有这个,Session_End将不会被触发。 见this
此处需要注意的另一个非常重要的事情是,如果您不在会话中保存任何内容,则Session_End事件将不会触发。会话中必须至少保存一次用于触发Session_End事件的内容。这也意味着如果您在第一个请求中保存会话并在同一请求中放弃会话,则Sesison_End事件将不会触发,因为会话中没有任何内容保存。
答案 1 :(得分:6)
在web.config中,您需要将sessionState元素作为元素的子元素
<configuration>
<system.web>
<sessionState mode="InProc" />
.....
</system.web>
</configuration>
答案 2 :(得分:5)
我不知道这是一个功能还是错误。或者可能是我在ASP.NET中没有理解足够的会话管理。但这就是我发现的。
如果未声明Session_Start,则不会在ASP.NET MVC 4中触发Session_End(在web.config中使用sessionState元素的默认设置)。
所以你需要声明Session_Start来捕获Session_End:)
protected void Session_Start(Object sender, EventArgs e) { }
protected void Session_End(Object sender, EventArgs e) {
Debug.WriteLine("End. " + Session.SessionID);
}
答案 3 :(得分:1)
你确定它永远不会发射吗?
据我所知,Session_End
与当前请求无关,因为ASP.NET会话在客户端的最后一个请求到达后超时终止。对FormsAuthenticaion.SignOut
的调用会操纵身份验证Cookie,因此如果没有来自客户端(浏览器)的任何连接,则无效。
看看这个问题(有答案) - 问题或多或少与你的问题类似,所以你可能找到一个正确的解决方案:
Session_End in Global.asax.cs not firing using forms authentication
希望这有帮助。
答案 4 :(得分:0)
我不知道它是如何工作的,但是当我在超时后关闭浏览器时会触发它。
public void Session_End(Object sender, SessionEndedEventArgs e)
{
}
从
中调用此方法 Application_Start() Event
SessionEndModule.SessionEnd += new SessionEndEventHandler(Session_End);