提问人:GateKiller 提问时间:8/15/2008 最后编辑:Pure.KromeGateKiller 更新时间:11/2/2012 访问量:108649
清除 ASP.NET 中的页面缓存
Clearing Page Cache in ASP.NET
问:
对于我的博客,我想使用输出缓存将特定帖子的缓存版本保存大约 10 分钟,这很好......
<%@OutputCache Duration="600" VaryByParam="*" %>
但是,如果有人发表评论,我想清除缓存,以便刷新页面并可以看到评论。
如何在 ASP.Net C# 中执行此操作?
答:
嗯。可以在 OutputCache 项上指定 VaryByCustom 属性。此值将作为参数传递给可在 global.asax 中实现的 GetVaryByCustomString 方法。此方法返回的值用作缓存项的索引 - 例如,如果返回页面上的注释数,则每次添加注释时都会缓存一个新页面。
需要注意的是,这实际上不会清除缓存。如果博客条目被大量使用评论,则使用此方法可能会使缓存大小爆炸。
或者,可以将页面的不可更改位(导航、广告、实际博客条目)实现为用户控件,并在每个用户控件上实现部分页面缓存。
如果将“*”更改为缓存应随其变化的参数(PostID?),则可以执行以下操作:
//add dependency
string key = "post.aspx?id=" + PostID.ToString();
Cache[key] = new object();
Response.AddCacheItemDependency(key);
当有人添加评论时......
Cache.Remove(key);
我想这甚至可以使用 VaryByParam *,因为所有请求都将绑定到相同的缓存依赖项。
我找到了我一直在寻找的答案:
HttpResponse.RemoveOutputCacheItem("/caching/CacheForever.aspx");
评论
使用 Response.AddCacheItemDependency 清除所有输出缓存。
public class Page : System.Web.UI.Page
{
protected override void OnLoad(EventArgs e)
{
try
{
string cacheKey = "cacheKey";
object cache = HttpContext.Current.Cache[cacheKey];
if (cache == null)
{
HttpContext.Current.Cache[cacheKey] = DateTime.UtcNow.ToString();
}
Response.AddCacheItemDependency(cacheKey);
}
catch (Exception ex)
{
throw new SystemException(ex.Message);
}
base.OnLoad(e);
}
}
// Clear All OutPutCache Method
public void ClearAllOutPutCache()
{
string cacheKey = "cacheKey";
HttpContext.Cache.Remove(cacheKey);
}
这也可用于 ASP.NET MVC 的 OutputCachedPage。
评论
为什么不对 Posts 表使用 SqlCacheDependency?
这样,您就不会实现自定义缓存清除代码,而只是在数据库中的内容发生变化时刷新缓存吗?
如果您知道要清除缓存的页面,以上就可以了。在我的实例(ASP.NET MVC)中,我引用了来自各地的相同数据。因此,当我执行[保存]时,我想清除整个站点的缓存。这对我有用:http://aspalliance.com/668
这是在 OnActionExecuting 筛选器的上下文中完成的。通过在 BaseController 或其他东西中重写 OnActionExecuting 可以很容易地完成。
HttpContextBase httpContext = filterContext.HttpContext;
httpContext.Response.AddCacheItemDependency("Pages");
设置:
protected void Application_Start()
{
HttpRuntime.Cache.Insert("Pages", DateTime.Now);
}
小调整: 我有一个助手,它添加了“闪光消息”(错误消息、成功消息 - “此项目已成功保存”等)。为了避免闪光消息出现在随后的每个 GET 中,我不得不在编写闪消息后失效。
清除缓存:
HttpRuntime.Cache.Insert("Pages", DateTime.Now);
希望这会有所帮助。
评论
OutputCacheAttribute.ChildActionCache = new MemoryCache("NewRandomStringNameToClearTheCache");
HttpRuntime.Close()
..我尝试了所有方法,这是唯一对我有用的方法
评论
在母版页加载事件中,请编写以下内容:
Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1));
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetNoStore();
并在注销按钮中单击:
Session.Abandon();
Session.Clear();
评论