如何在 ASP.NET 中使用所有用户都可以访问的缓存,而不仅仅是特定的用户上下文,同时在用户关闭浏览器窗口或过期(如会话对象)时自动删除此缓存的特定键?
问问题
1238 次
2 回答
6
缓存可供所有用户访问,您可以将其设置为在一段时间后过期:
Cache.Insert("key", myTimeSensitiveData, null,
DateTime.Now.AddMinutes(1), TimeSpan.Zero);
通过实现 global.asax 的会话结束事件,您可以在会话到期时删除缓存条目
void Session_End(Object sender, EventArgs E)
{
Cache.Remove("MyData1");
}
有关缓存的更多详细信息,请参阅此内容
编辑: 关于您在用户关闭浏览器时如何做出反应的问题,我认为这并不简单。您可以在客户端尝试 javascript 来处理“卸载”事件,但这并不可靠,因为浏览器/客户端可能会崩溃。在我看来,“心跳”方法会起作用,但需要额外的努力。有关更多信息,请参阅此问题。
于 2012-04-17T02:34:35.377 回答
0
您必须使用Session_OnEnd() 事件从缓存中删除该项目。但是,如果用户只是关闭浏览器,则不会触发此事件。该事件只会在会话超时时触发。您可能应该添加一个检查以查看该项目是否已被删除:
public void Session_OnEnd()
{
// You need some identifier unique to the user's session
if (Cache["userID"] != null)
Cache.Remove("userID");
}
此外,如果您希望缓存中的项目在用户会话期间保持活动状态,则需要对项目使用滑动到期并在每次请求时刷新它。我在 OnActionExecuted(仅限 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);
}
于 2012-04-17T02:52:55.567 回答