代码之家  ›  专栏  ›  技术社区  ›  MorgoZ

避免对ASP.NET MVC 5应用程序的操作[duplicate]执行OnResultExecuted筛选器

  •  4
  • MorgoZ  · 技术社区  · 6 年前

    我正在开发一个MVC5应用程序,它有一个OnResultExecuted过滤器,将响应缓存设置为始终“no cache no store”:

    public class NoCacheActionFilter : ActionFilterAttribute
    {       
        public override void OnResultExecuted(ResultExecutedContext filterContext)
        {
            HttpCachePolicyBase cache = filterContext.HttpContext.Response.Cache;
            DateTime now = DateTime.UtcNow;
    
            cache.SetCacheability(HttpCacheability.NoCache);
            cache.SetExpires(now.AddDays(-1));
            cache.SetNoStore();
    
            base.OnResultExecuted(filterContext);
        }
    }
    

    [OutputCache(Duration =300, Location =System.Web.UI.OutputCacheLocation.Client)]
    

    但是,由于过滤器的原因,它永远不会被缓存。

    谢谢。

    1 回复  |  直到 6 年前
        1
  •  0
  •   MorgoZ    6 年前

    既然这个问题的答案被删除了。。。我不知道为什么。。。我将发布对我有效的解决方案。我留下这个答案是因为我觉得有趣的是,有另一种方法可以避免默认的全局过滤器,而不是像在发布的完全有效的解决方案中那样实现“哑”属性 here

    首先:这个解决方案是有效的,因为OutputCacheAttribute的“AllowMultiple”设置为false,所以可以替换NoCacheActionFilter,只需在全局过滤器中添加OutputCacheAttribute,如

    filters.Add(new OutputCacheAttribute { Location = OutputCacheLocation.None, NoStore = true, Duration = 0, VaryByParam = "*" });
    

    [OutputCache(Duration =300, VaryByParam = "param")]
    public FileContentResult WhateverWithCache(string param)
    {}
    

    旁注:

    OutputCacheAttribute中的“AllowMultiple”属性是一个可以在C#中实现的任何属性中定义的属性,它告诉该属性是否可以为单个元素设置多次。更多信息 here