2013-10-09 28 views
1

简而言之,我们希望我们的会话持续一个工作日,并在晚上暂停。目前,我在Session_Start中设置了一些简单的逻辑,将超时设置为直到下午6点的分钟数。以编程方式刷新ASP.NET MVC4应用程序中的会话超时

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

有没有什么办法可以覆盖刷新会话的默认逻辑,只有当剩余的X少于X时才将其设置为X?所以,如果它还剩下20分钟,我会将其恢复到20分钟,但是否则不要放弃它?

感谢您的阅读!

+0

好像你已经滑动过期,想要绝对过期。我知道使用缓存项目很容易,但我不确定会话。我会看。 – Zerkey

+0

我也在看那个,但是在某个时候我确实想要扩展它。如果有人工作迟到,我不希望他们的会话每20分钟过期一次。 – GoodGuyJim

回答

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点过期。如果你有一个,试着把它放在母版页上。

+0

“好吧,如果用户在早上8点登录,超时时间将设置为10小时,如果他们在该时间范围内再次访问您的网站,他们的会话将延长10个小时。” 是的,这正是我想要避免的,这就是为什么我不想刷新它,除非它不到20分钟。 感谢您的建议,我会研究它 – GoodGuyJim

+0

不客气。我扩大了我的答案,并添加了一些代码,检查出来。 – Zerkey

+0

我使用的是MVC,所以我没有Page_Load事件。最接近的是从System.Web.MVC.Controller重写虚拟方法,但我不知道哪一个会刷新超时,希望有人这样做。 – GoodGuyJim

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; 
}