Session_End不开火?

Afs*_*bbi 23 asp.net session

我想在他的会话超时时注销用户.所以在Global.asax中使用以下代码:

protected void Session_End(object sender, EventArgs e)
{
    FormsAuthentication.SignOut();
}
Run Code Online (Sandbox Code Playgroud)

但似乎session_end永远不会开火.任何想法如何解决它?我正在使用ASP.NET默认设置.

pol*_*h.o 43

您可以在Session_Start中设置一些会话数据.如果没有这个,Session_End将不会被触发.看到这个

此处另一个非常重要的事项是,如果您不在会话中保存任何内容,则Session_End事件将不会触发.会话中必须至少保存一次用于触发Session_End事件的内容.这也意味着如果您在第一个请求中保存会话并在同一请求中放弃会话,则Sesison_End事件将不会触发,因为会话中没有任何内容保存.

  • 如果会话模式属性设置为InProc以外的值(默认模式),则不支持Session_OnEnd事件.是你的情况吗? (3认同)
  • 我有相同的问题,但我确实在Session_Start中保存了一些东西(Session ["abc"] ="xyz";).但它不起作用.:( (2认同)

The*_*eed 7

在web.config中,您需要将sessionState元素作为元素的子元素

<configuration>
     <system.web>
          <sessionState mode="InProc" />
          .....
     </system.web>
</configuration>
Run Code Online (Sandbox Code Playgroud)

  • 您是在IIS或Visual Studio中运行它,如果它在VisualStudio中使用WebDev,那么您将看不到事件触发.要测试它,您需要将您的网站放在IIS中并将调试器附加到w3wp.exe (3认同)
  • 同样值得一提的是,Session_End不适用于InProc以外的任何sessionState. (2认同)

res*_*kiy 5

我不知道这是一个功能还是bug.或者可能是我在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);
}
Run Code Online (Sandbox Code Playgroud)