【问题标题】:Apply a browser caching policy to all ASP.NET Core MVC pages将浏览器缓存策略应用于所有 ASP.NET Core MVC 页面
【发布时间】:2017-06-25 03:59:58
【问题描述】:

我想告诉 ASP.NET Core 为 MVC 控制器提供的所有响应(HTML 页面和 Web API 响应)添加一个通用的 Cache-Control 和相关标头。我不希望该策略适用于缓存静态文件;那些我想被缓存的。

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

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

我可以用这个属性制作一个基本控制器,并从中派生所有其他控制器。我想知道是否有一种基于配置的方法可以避免对这种基本控制器的需求。

【问题讨论】:

  • 在您的情况下使用中间件会是一个可行的解决方案吗?
  • 如果它可以完成工作,我愿意使用中间件。我希望它能够很好地与 MVC 缓存控制功能配合使用。例如,我想要灵活性,如果将来我想覆盖给定 MVC 页面上的缓存,我仍然可以在相应的控制器方法上使用 ResponseCache 属性,并且它会优先。跨度>

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


【解决方案1】:

你可以通过添加没有中间件来做到这一点

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

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

【讨论】:

  • 如果需要,您能否将自定义属性应用到各个控制器和方法以覆盖 ConfigureServices 设置?
  • @Tseng,我几个月前第一次尝试这个,当时我认为它有效。但是当我在一个新的 ASP.NET Core Web 应用程序(Visual Studio 的基本模板)上尝试它并添加您的代码时,它不起作用。该站点运行良好,但未输出缓存标头。有没有比你提到的方法更新的方法?或者您可以从一个新的 ASP.NET Core 站点开始使用您的技术吗?
  • 我刚刚在一个新的 ASP.NET Core 站点上试了一下,它成功了。
  • 检查您是否有两次services.AddMvc。也许第二个实例正在覆盖第一个实例。
【解决方案2】:

正如@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
     }
}

【讨论】:

  • 您是否必须将过滤器应用于每个控制器?如果是这样,我看不到使用 ResponseCache 属性的优势。
  • @EdwardBrey 您可以将过滤器注册为全局过滤器
  • 自己插入标题的一个限制是,如果您想保留使用 MVC ResponseCache 属性来覆盖某些页面的默认缓存策略的灵活性,您必须自己编写协调代码。
猜你喜欢
  • 2018-06-29
  • 1970-01-01
  • 2020-11-14
  • 2010-10-29
  • 2011-04-09
  • 2023-04-08
  • 2014-03-30
  • 2014-05-26
  • 1970-01-01
相关资源
最近更新 更多