【问题标题】:Avoid OnResultExecuted Filter on ASP.NET MVC 5 application's Action [duplicate]避免在 ASP.NET MVC 5 应用程序的操作上使用 OnResultExecuted 过滤器 [重复]
【发布时间】:2018-10-17 08:05:48
【问题描述】:

我正在开发具有 OnResultExecuted 过滤器的 MVC5 应用程序,该过滤器将响应缓存设置为始终“无缓存无存储”:

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);
    }
}

但是我有一个 Action 需要缓存它的结果,所以我在它上面设置了 OutputCahce 属性。

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

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

我的问题是,是否有办法避免仅针对该操作进行过滤。

谢谢。

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-5 action-filter


    【解决方案1】:

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

    首先:这个解决方案是有效的,因为OutputCacheAttribute的“AllowMultiple”设置为false,所以替换NoCacheActionFilter并在Global Filters中添加OutputCacheAttribute就好了

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

    然后如果我在操作级别添加一个 OutputCacheAttribute,它将替换之前配置的全局默认 OutputCache 过滤器(因为它已将 AllowMultiple 设置为 false)。

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

    旁注:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多