【问题标题】:Can you set a specific session variable to live for only 5 minutes?您可以将特定会话变量设置为仅存活 5 分钟吗?
【发布时间】:2018-12-12 14:32:33
【问题描述】:

关于ASP.NET Webforms 有没有办法将会话变量的生存时间设置为 5 分钟?

例如,如果我有变量:

Session["Name"] = "Bob";

我希望它在 5 分钟后被销毁,或者至少能够使其无效。

例子:

Session["Name"] = null;
//But in the background and not code-controlled as it has to be live over multiple pages.

我知道这些 Session 变量会在 IIS 中控制的超时时过期,但我试图在超时发生之前以 5 分钟为间隔使它们过期,这可能吗?

【问题讨论】:

  • 不,这是不可能的,但您可以添加时间戳并检查 5 分钟是否已过
  • sessionState?或者在 JS 中检查时间的 setTimeout
  • @Aristos 你介意详细说明一下吗?
  • @user5173426 我想如果你使用 JS 来执行此操作,如果你在客户端运行它,如果每 5 分钟销毁一次 Session 变量至关重要并且客户端 JS 被禁用,这可能是一个问题这意味着在服务器端的帖子之间进行,有没有办法做到这一点?

标签: c# asp.net session webforms


【解决方案1】:

创建两个会话值(或包含这两个值的单个对象,我可能更喜欢这样做,但为简单起见,我们只使用两个值来说明),一个带有值,一个带有到期时间。

Session["Name"] = "Bob";
Session["NameExpiry"] = DateTime.UtcNow.AddMinutes(5);

然后无论你在哪里使用该值,检查它的到期时间:

if (Session["NameExpiry"] != null && DateTime.Parse(Session["NameExpiry"]) < DateTime.UtcNow)
{
    Session["Name"] = null;
    Session["NameExpiry"] = null;
}

您可以加入各种错误检查、值的其他逻辑等。但原则是相同的。本质上,不要认为它试图设置某种后台计时器来主动使会话数据过期,考虑将过期时间存储为会话数据的一部分,并在该时间戳之后下次使用它时静默过期.

【讨论】:

  • 我认为我的想法有误,这是一个很好的解决方案,我可以调整它以满足我的特定需求,所以谢谢。你在使用时检查是对的,而不是在后台。
【解决方案2】:

由于会话存储在服务器端。创建一个可以在客户端 5 分钟后调用的操作。

public class ControllerName
{
   public ActionResult ClearSession()
   {
      Session = null;
   }
}

然后在客户端:

<script>

    setTimeout(function(){  $.ajax('/ControllerName/ClearSession'); }, 300000);

</script>

提到OP后:

我遇到的问题是它是客户端控制的。我需要它在阻止 JS 在页面上运行的用户的情况下工作

Session["Name"] = "Bob";

//task that will run after the specified interval
Task.Delay(300000).ContinueWith((task) => {
    Session.Remove(Name);
});

【讨论】:

  • 我遇到的问题是它是客户端控制的。我需要它在阻止 JS 在页面上运行的用户的情况下工作。
  • 该任务真的会在原始请求后五分钟运行吗?或者到那时整个线程早就消失了?
  • 为用户加载页面后,该任务将被终止。
  • 5 分钟后我希望它被销毁,或者至少能够使其无效。不是这样吗?
  • 如果线程是异步的,线程将被杀死,如果不是,用户将被锁定在页面加载中等待等待
猜你喜欢
  • 1970-01-01
  • 2021-06-01
  • 1970-01-01
  • 2019-05-21
  • 1970-01-01
  • 2011-09-04
  • 2011-07-01
  • 2010-09-20
  • 1970-01-01
相关资源
最近更新 更多