我的情况是,在我们的应用中,有很多内容可以放在OutputCache
中,但任何用户都可以在任何时候刷新此内容。我需要做的是在任何用户发起刷新操作时完全清除缓存。
我认为这很简单,HttpResponse
有一个方法RemoveFromOutputCache
。但是,此方法采用一个字符串,该字符串是已缓存的项目的名称。看起来没有任何简单的方法来获取已缓存的项目名称列表。
因此,我使用以下类覆盖了OutputCacheAttribute
:
public class HierarchyOutputCache : OutputCacheAttribute
{
public static readonly ConcurrentBag<string> CachedPages = new ConcurrentBag<string>();
public HierarchyOutputCache(params string[] varyParameters)
{
Location = OutputCacheLocation.Server;
Duration = int.MaxValue;
VaryByParam = string.Join(";", varyParameters);
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
CachedPages.Add(filterContext.HttpContext.Request.RawUrl);
}
}
然后,当我的应用程序中遇到某个动作时,我可以执行以下操作:
HierarchyOutputCache.CachedPages.ForEach(Response.RemoveOutputCacheItem);
但是,Response.RemoveOutputCacheItem
无法正常工作,我认为这是因为我传递的错误字符串包含我存储在属性中的RawUrl
。
我找不到任何关于这个名字应该是什么的信息,有人可以帮忙吗?
答案 0 :(得分:1)
我在HierarchyOutputCache
课程中使用以下项目名称轻松解决了这个问题:
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
CachedPages.Add(filterContext.HttpContext.Request.CurrentExecutionFilePath);
}
这意味着我对HierarchyOutputCache.CachedPages.ForEach(Response.RemoveOutputCacheItem)
的呼吁按预期工作!