ASP.NET MVC - 在几分钟不活动后擦除会话数据

时间:2013-02-01 20:49:24

标签: asp.net asp.net-mvc asp.net-mvc-3

在我的网络应用程序中,我经常可以看到,当我几分钟没有做任何事情,然后我回来,刷新页面 - 我仍在登录,但我的会话数据全部消失了!

login()操作中,我设置了一些页面正常工作所需的Session[]个对象。我不知道为什么会这样做,但是我需要它在用户清除会话数据时将其记录下来。

我已经阅读了关于设置<sessionState mode="InProc" timeout="20"/>但是每次刷新页面时都会刷新此超时吗?或者从我登录后的20分钟后它会用完吗?如果我让这个计时器比我保持在线用户更大,该怎么办?

3 个答案:

答案 0 :(得分:3)

回发到服务器会使会话保持更长时间。这是一个滑动过期。有两种方法可以从客户端处理,客户端不知道这20分钟的超时:

  • 使用客户端javascript创建计时器,该计时器在20分钟后重定向到注销页面
  • 每当发生回发时,检查会话是否过期(可以通过多种方式完成,例如检查Session.IsNewSession,查看对象是否丢失等),然后在处理之前重定向到注销处理程序请求。

答案 1 :(得分:1)

我假设您正在使用表单身份验证。那是对的吗?如果是这样,您需要使表单身份验证票证的超时与会话超时匹配。

用户通过比最初看起来更复杂的过程保持登录状态。 Cookie存储在用户的浏览器中,称为Forms Authentication Ticket。如果用户保持空闲超过会话超时限制,则服务器将丢弃该会话。但是在下一个请求中,表单身份验证票证将传递回Web服务器。服务器验证票证,如果它仍然有效,则用户将重新登录。

如您所见,用户的会话未恢复。如果您想要这种行为,则必须检测该情况并自行恢复会话。

解决方案是将Forms Authentication Ticket的超时设置为与Session超时相同。您可以在Web.config文件as explained here中完成此任务:

<system.web>
    <authentication mode="Forms">
          <forms timeout="20"/>
    </authentication>
</system.web>

超时值以分钟为单位。一旦达到Forms Authentication Ticket的超时,用户将被注销。这与会话的超时无关,但如果它们相同,则它们将在大致相同的时间到期。如果您想要完全安全,请将Forms Authentication Ticket超时设置为略短于会话超时。用户将在会话超时之前注销。当他们再次登录时,他们将获得一个新的会话。旧会议最终会自行结束。

答案 2 :(得分:0)

尝试检查:

  

问:在Proc模式下,为什么我偶尔会丢失所有会话?

     

答:请参阅“了解会话”中的“健壮性”部分   状态模式“本文的一部分。

     

<强>鲁棒性

     

InProc - 如果工作进程,会话状态将丢失   (aspnet_wp.exe)回收,或者appdomain重新启动。这是因为   会话状态存储在appdomain的内存空间中。该   重启可能是由某些配置文件的修改引起的   as web.config和machine.config,或\ bin目录中的任何更改   (比如使用VS重新编译应用程序后的新DLL)For   有关详细信息,请参阅KB324772。在v1中,还会有一个错误   工作进程重启。它在SP2和v1.1中修复。看到   KB321792。

来源 - http://forums.asp.net/t/7504.aspx/1