使用缓存 ASP.NET

本文关键字:NET ASP 缓存 | 更新日期: 2023-09-27 18:31:16

如何在所有用户(而不仅仅是特定用户上下文)都可以访问的 ASP.NET 中使用缓存,同时在用户关闭浏览器窗口或过期时自动删除此缓存的特定键(如会话对象)?

使用缓存 ASP.NET

所有用户都可以访问缓存,您可以将其设置为在一段时间后过期:

Cache.Insert("key", myTimeSensitiveData, null, 
DateTime.Now.AddMinutes(1), TimeSpan.Zero);

只要会话过期,您就可以通过实现 global.asax 的会话结束事件来删除缓存条目

void Session_End(Object sender, EventArgs E) 
{ 
  Cache.Remove("MyData1");
}

有关缓存的更多详细信息,请参阅此处

编辑:关于您关于用户关闭浏览器时如何反应的问题,我认为这并不简单。您可以在客户端尝试javascript来处理"unload"事件,但这并不可靠,因为浏览器/客户端可能会崩溃。在我看来,"心跳"方法会起作用,但它需要额外的努力。有关详细信息,请参阅此问题。

您必须使用 Session_OnEnd() 事件从缓存中删除该项。但是,如果用户只是关闭浏览器,则不会触发此事件。该事件仅在会话超时时触发。您可能应该添加一个检查以查看该项目是否已被删除:

public void Session_OnEnd()
{
    // You need some identifier unique to the user's session
    if (Cache["userID"] != null)
        Cache.Remove("userID");
}

此外,如果希望缓存中的项目在用户会话期间保持活动状态,则需要对项目使用滑动过期,并随每个请求刷新它。我在OnActionExecute(仅限 ASP.NET MVC)中执行此操作。

protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
    // Put object back in cache in part to update any changes
    // but also to update the sliding expiration
    filterContext.HttpContext.Cache.Insert("userID", myObject, null, Cache.NoAbsoluteExpiration,
        TimeSpan.FromMinutes(20), CacheItemPriority.Normal, null);
    base.OnActionExecuted(filterContext);
}