【问题标题】:Overriding Global cache setting in Asp.net MVC覆盖 Asp.net MVC 中的全局缓存设置
【发布时间】: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


    【解决方案1】:

    您可以创建自己的属性来排除某些属性上的全局过滤器,例如,创建一个存根属性:

    public class ExcludeCacheFilterAttribute : Attribute
    {
    }
    

    现在在CachingFilter 中,在运行您的代码之前检查此属性:

    public class CachingFilter : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            if (filterContext.ActionDescriptor.GetCustomAttributes(typeof(ExcludeCacheFilterAttribute), false).Any())
            {
                return;
            }            
    
            //Carry on with the rest of your usual caching code here
        }
    }
    

    【讨论】:

    • 嗨@DavidG,感谢您的努力,但这并没有帮助。我也尝试将 ExcludeCacheFilterAttribute 应用到 Controller,但我仍然无法缓存我的 Action。
    • 那么你尝试调试它了吗?是否在正确发送缓存详细信息之前退出OnActionExecuting 方法?
    猜你喜欢
    • 2022-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    • 2015-07-01
    • 2011-02-25
    • 1970-01-01
    相关资源
    最近更新 更多