编程语言
首页 > 编程语言> > c# – 避免OnResultExecuted过滤ASP.NET MVC 5应用程序的动作

c# – 避免OnResultExecuted过滤ASP.NET MVC 5应用程序的动作

作者:互联网

参见英文答案 > How to disable a global filter in ASP.Net MVC selectively                                    8个
我正在开发一个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);
    }
}

但我有一个需要缓存其结果的Action,所以我在其上设置OutputCahce属性.

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

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

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

谢谢.

解决方法:

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

第一:此解决方案仅有效,因为OutputCacheAttribute将“AllowMultiple”设置为false,因此可以替换NoCacheActionFilter,只需在Global Filters中添加OutputCacheAttribute即可

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

然后,如果我在Action级别添加OutputCacheAttribute,它将替换之前配置的Global默认OutputCache过滤器(因为它将AllowMultiple设置为false).

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

边注:

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

标签:c,asp-net-mvc,asp-net-mvc-5,action-filter
来源: https://codeday.me/bug/20190710/1424832.html