【发布时间】:2017-09-13 12:47:43
【问题描述】:
我有一个 ASP.Net MVC5 应用程序。我通过应用全局过滤器禁用了整个应用程序的缓存,如下所示:
public class CachingFilter : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache); // HTTP 1.1.
filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
filterContext.HttpContext.Response.Cache.AppendCacheExtension("no-store, must-revalidate");
filterContext.HttpContext.Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0.
filterContext.HttpContext.Response.AppendHeader("Expires", "0"); // HTTP 1.0.
}
}
上面的过滤器很好地禁用了缓存。但是现在我有一个动作可以将一些统计信息填充为 PartialView。出于测试目的,我想通过如下应用 OutputCacheAttribute 来启用 20 秒的缓存:
[AcceptVerbs(HttpVerbs.Get)]
[OutputCache(Location = OutputCacheLocation.Client, Duration = 20, VaryByParam = "*")]
public PartialViewResult Statistics()
{
var stats = GetStatistics();
return PartialView("~/Views/Shared/_Statistics.cshtml", stats);
}
无论我做什么,如果在应用程序全局中启用了 CachingFilter,即使没有经过 20 秒的时间段,也会始终调用 Statistics() 方法。如果我从全局禁用 CachingFilter,Statistics() 方法将被正确缓存。
我认为/读到将缓存过滤器应用于操作是缓存的最终判决。如何绕过动作级别的全局缓存属性,而不在全局缓存过滤器的 if 子句中添加动作/控制器名称?
【问题讨论】:
标签: c# asp.net-mvc caching asp.net-mvc-5