将浏览器缓存策略应用于所有ASP.NET Core MVC页面

时间:2017-02-07 18:59:58

标签: asp.net-core browser-cache cache-control

我想告诉ASP.NET Core为MVC控制器提供的所有响应添加公共Cache-Control和相关标头,包括HTML页面和Web API响应。我不希望策略应用于缓存静态文件;那些我想要缓存的。

在特殊情况下,我想禁用缓存,相当于将此属性应用于所有控制器:

[ResponseCache(NoStore = true, Location = ResponseCacheLocation.None)]

我可以使用此属性创建一个基本控制器,并从中派生所有其他控制器。我想知道是否存在基于配置的方法,以避免需要这样的基本控制器。

2 个答案:

答案 0 :(得分:13)

只需添加

即可完成中间件
services.AddMvc(options => {
    options.Filters.Add(new ResponseCacheAttribute() { NoStore = true, Location = ResponseCacheLocation.None });
})

在您的ConfigureServices方法中。适用于任何属性(即AuthorizeAttribute),可以实例化并应用于所有控制器和操作。也不需要基类。

答案 1 :(得分:1)

正如@DOMZE所说,您可以考虑使用自定义中间件。实际上,response caching已经作为中间件实现了。

但是,由于您只想为所有MVC操作添加缓存,更好的方法是使用MVC action filters。其中一个好处是您可以仅将过滤器应用于特定控制器/操作+您将可以访问ActionExecutingContext(控制器实例/操作参数)

public class ResponseCacheActionFilter : IActionFilter
{
     public void OnActionExecuting(ActionExecutingContext context)
     {
        // before the action executes
     }

     public void OnActionExecuted(ActionExecutedContext context)
     {
        // after the action executes
        // add here a common Cache-Control and related headers to all responses
     }
}