避免在ASP.NET MVC 5应用程序的操作上使用OnResultExecuted过滤器

时间:2018-10-17 08:05:49

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

我正在使用一个具有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)]

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

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

谢谢。

1 个答案:

答案 0 :(得分:0)

好吧,由于该问题的答案已被删除...我不知道为什么...我将发布对我有用的解决方案。我留下了答案,因为我认为很有趣的是,除了在here发布的完全有效的解决方案中实现“哑”属性之外,还有另一种避免默认全局过滤器的方法。

首先:此解决方案仅是有效的,因为OutputCacheAttribute的“ AllowMultiple”设置为false,因此可以替换NoCacheActionFilter并仅在全局过滤器处添加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