我想告诉ASP.NET Core为MVC控制器提供的所有响应添加公共Cache-Control
和相关标头,包括HTML页面和Web API响应。我不希望策略应用于缓存静态文件;那些我想要缓存的。
在特殊情况下,我想禁用缓存,相当于将此属性应用于所有控制器:
[ResponseCache(NoStore = true, Location = ResponseCacheLocation.None)]
我可以使用此属性创建一个基本控制器,并从中派生所有其他控制器。我想知道是否存在基于配置的方法,以避免需要这样的基本控制器。
答案 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
}
}