简而言之,我们希望我们的会话持续一个工作日,并在晚上暂停。目前,我在Session_Start中设置了一些简单的逻辑,将超时设置为直到下午6点的分钟数。以编程方式刷新ASP.NET MVC4应用程序中的会话超时
我的问题是刷新超时获取设置返回为该值,所以如果您在上午8点登录,您的会话将保持刷新到10小时。
有没有什么办法可以覆盖刷新会话的默认逻辑,只有当剩余的X少于X时才将其设置为X?所以,如果它还剩下20分钟,我会将其恢复到20分钟,但是否则不要放弃它?
感谢您的阅读!
简而言之,我们希望我们的会话持续一个工作日,并在晚上暂停。目前,我在Session_Start中设置了一些简单的逻辑,将超时设置为直到下午6点的分钟数。以编程方式刷新ASP.NET MVC4应用程序中的会话超时
我的问题是刷新超时获取设置返回为该值,所以如果您在上午8点登录,您的会话将保持刷新到10小时。
有没有什么办法可以覆盖刷新会话的默认逻辑,只有当剩余的X少于X时才将其设置为X?所以,如果它还剩下20分钟,我会将其恢复到20分钟,但是否则不要放弃它?
感谢您的阅读!
您的超时时间仅在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点过期。如果你有一个,试着把它放在母版页上。
“好吧,如果用户在早上8点登录,超时时间将设置为10小时,如果他们在该时间范围内再次访问您的网站,他们的会话将延长10个小时。” 是的,这正是我想要避免的,这就是为什么我不想刷新它,除非它不到20分钟。 感谢您的建议,我会研究它 – GoodGuyJim
不客气。我扩大了我的答案,并添加了一些代码,检查出来。 – Zerkey
我使用的是MVC,所以我没有Page_Load事件。最接近的是从System.Web.MVC.Controller重写虚拟方法,但我不知道哪一个会刷新超时,希望有人这样做。 – GoodGuyJim
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;
}
好像你已经滑动过期,想要绝对过期。我知道使用缓存项目很容易,但我不确定会话。我会看。 – Zerkey
我也在看那个,但是在某个时候我确实想要扩展它。如果有人工作迟到,我不希望他们的会话每20分钟过期一次。 – GoodGuyJim