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

Edw*_*rey 8 cache-control browser-cache asp.net-core

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

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

[ResponseCache(NoStore = true, Location = ResponseCacheLocation.None)]
Run Code Online (Sandbox Code Playgroud)

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

Tse*_*eng 14

只需添加即可完成中间件

services.AddMvc(options => {
    options.Filters.Add(new ResponseCacheAttribute() { NoStore = true, Location = ResponseCacheLocation.None });
})
Run Code Online (Sandbox Code Playgroud)

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


Set*_*Set 1

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

但由于您只想为所有 MVC 操作添加缓存,所以更好的方法是使用 MVC操作过滤器。好处之一是您可以仅将过滤器应用于特定的控制器/操作+您将有权访问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
     }
}
Run Code Online (Sandbox Code Playgroud)