以编程方式刷新ASP.NET MVC4应用程序中的会话超时

时间:2013-10-09 18:21:30

标签: c# asp.net asp.net-mvc session session-timeout

简而言之,我们希望我们的会话能够持续一个工作日并在晚上超时。目前我在Session_Start中设置了一些简单的逻辑,将超时设置为剩余的分钟数,直到下午6点。

我的问题是刷新超时设置返回到该值,所以如果你在早上8点登录,你的会话将保持刷新到10小时。

有没有办法覆盖刷新会话的默认逻辑,只有在剩余少于X的情况下才将其设置为X?所以,如果剩下不到20分钟的时间,我会把它恢复到20分钟,但另外一个人呢?

感谢阅读!

2 个答案:

答案 0 :(得分:2)

您的超时仅在Session_Start的global.asax中设置,因此如果用户在上午8点登录,则超时将设置为10小时。如果他们在该时间范围内再次访问您的网站,他们的会话又延长了10个小时,因为Session_Start中的逻辑不会再次触发。

解决方案1可以提供基于this article。基本上,您通过引用List添加每个新Session。下午6点,您可以遍历此列表并Session.Abandon()任何打开的会话。这样可以将所有超时逻辑保存在一个或两个文件中。

您还可以在Page_Load()中添加一个获取当前时间并调整Session.Timeout属性的方法。这是一个例子:

protected void Page_Load(object sender, EventArgs e)
{
    int timeout = 20;

    var hr = DateTime.Now.Hour;
    var min = DateTime.Now.Minute;
    var time = (hr * 60) + min;

    //1080 minutes = 6pm

    if (time <= 1080)
    {
        timeout = 1080 - time;
    }

    if (time > 1080)
    {
        //1440 minutes = midnight
        timeout = (1440 - time) + 1080;
    }

    Session.Timeout = timeout;

}

上述代码将在服务器时间下午6点到期。如果你有一个主页,请尝试将其放在母版页上。

答案 1 :(得分:0)

protected void Page_Load(object sender, EventArgs e)
{
  int timeout = 20;
  var hour = DataTime.Now.Hour;
  var minutes =DataTime.Now.Minutes;
  var time = (hour * 60) + minutes;
  if (time <= 2000)
  {
    timeout = 2000 - time;
  }
  if (time > 2000)
  {
    //3000 minutes = midnight
    timeout = (3000 - time) + 2000;
  }
  Session.Timeout = timeout;
}