2011-01-27 149 views
22

我想在会话超时时注销用户。因此在Global.asax中使用以下代码:Session_End不会触发?

protected void Session_End(object sender, EventArgs e) 
{ 
    FormsAuthentication.SignOut(); 
} 

但似乎session_end从不会触发。任何想法如何解决它?我使用默认设置的ASP.NET。

+3

你真的等待20分钟,为事件触发? – leppie 2011-01-27 06:42:18

+0

@leppie:绝对是!我也用这个替换了这一行:“抛出新的异常(”“);”但仍然不起作用。 – 2011-01-27 06:50:44

+0

@InSane:如何确保这一点?我知道我的会话在特定时间之后真正到期。因此,它似乎是InProc – 2011-01-27 06:51:42

回答

34

您可以在在session_start设置一些会话数据。没有这个,Session_End不会被解雇。 看到this

另外这里需要注意的另外一个非常重要的事情是,如果你没有在会话中保存任何的Session_End中的事件将不会触发。 Session_End事件触发时,会话中至少要保存一次。这也意味着,如果您在第一个请求中保存了会话中的某些内容并放弃了同一请求中的会话,则Sesison_End事件不会触发,因为会话中没有保存任何内容。

1

你确定它永远不会燃烧?

据我所知,Session_End与当前请求没有任何关系,因为在客户端的最后一个请求到达后,ASP.NET会话被超时终止。对FormsAuthenticaion.SignOut的调用操作身份验证Cookie,因此在没有客户端(浏览器)的任何连接的情况下无效。

看看这个问题(其中有一个答案) - 问题是或多或少与你相似,所以你可能会找到一个合适的解决方案:

Session_End in Global.asax.cs not firing using forms authentication

希望这有助于。

5

在你的web.config你需要有sessionState元素作为元素

<configuration> 
    <system.web> 
      <sessionState mode="InProc" /> 
      ..... 
    </system.web> 
</configuration> 
5

我不知道的孩子,是它的特征或缺陷。或者可能是我不明白在ASP.NET中的会话管理。但这是我发现的。

如果未声明Session_Start,则Session_End在ASP.NET MVC 4中不会触发(具有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); 
} 
0

我不知道它是如何工作的,但它会在超时时间后关闭浏览器时触发。

public void Session_End(Object sender, SessionEndedEventArgs e) 
    { 
    } 

调用此从

Application_Start() Event 

    SessionEndModule.SessionEnd += new SessionEndEventHandler(Session_End);