我如何计算OutputCache项的名称?

时间:2014-01-31 14:18:53

标签: c# .net asp.net-mvc

我的情况是,在我们的应用中,有很多内容可以放在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

我找不到任何关于这个名字应该是什么的信息,有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

我在HierarchyOutputCache课程中使用以下项目名称轻松解决了这个问题:

public override void OnActionExecuted(ActionExecutedContext filterContext)
{
    base.OnActionExecuted(filterContext);
    CachedPages.Add(filterContext.HttpContext.Request.CurrentExecutionFilePath);
}

这意味着我对HierarchyOutputCache.CachedPages.ForEach(Response.RemoveOutputCacheItem)的呼吁按预期工作!