ASP.NET Core 2.0 - Http响应缓存中间件 - 没有缓存

时间:2017-09-29 15:58:56

标签: asp.net caching http-caching asp.net-core-2.0

我在Visual Studio中使用WebApi .Net Core 2.0模板创建了一个新的解决方案。 我在启动时添加了以下内容。

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    services.AddHttpCacheHeaders(opt => opt.MaxAge = 600);
    services.AddResponseCaching();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseResponseCaching();
    app.UseHttpCacheHeaders();
    app.UseMvc();
}

然后,对于邮递员,我点击http://localhost:xxxx/api/values,这是由模板创建的端点,并返回["value1","value2"]

请注意,我确保Postman不发送no-cache标头(在Postman设置中)。

HttCacheHeaders服务来自repo。它添加了HTTP缓存标头。所以我的端点响应头是:

  • Cache-Control:public,max-age = 600
  • Content-Type:application / json;字符集= UTF-8
  • 日期:2017年9月29日星期五14:02:29 GMT
  • ETag:C5DFA8974BB722D27E71EE50D3D14625
  • 到期日:2017年9月29日星期五14:03:29 GMT
  • Last-Modified:Fri,29 Sep 2017 14:02:29 GMT
  • 服务器:Kestrel
  • 转移编码:chunked
  • 变化:接受,接受语言,接受编码
  • X-Powered-By:ASP.NET
  • X-SourceFiles:=?UTF-8?B?................

问题是没有任何东西被缓存。 Ouput窗口仅显示The response could not be cached for this request.

所以我对如何使用ASP.NET Core ResponseCaching Middleware感到有点迷失。

更新

如果我不使用HttCacheHeaders服务但是将[ResponseCache(Duration = 600)]添加到我的控制器的操作中,则缓存可以正常工作。
请注意,我要使用HttCacheHeaders的原因是ETagLast-Modified稍后执行验证缓存以及到期缓存。

2 个答案:

答案 0 :(得分:1)

这是一种非答案,有一些疑难解答提示。

我尝试了您的确切代码&它对我来说很好。也许在HttpCacheHeaders或ResponseCaching repo中修复了一个bug?

不幸的是,调试服务器端的ResponseCaching很棘手,因为它有一些奇怪的规则&没有足够的记录。当我过去遇到类似的问题时,我不得不取消微软的源代码来逐步完成它。找到我的代码的问题。

您在输出窗口中找到的注释“无法为此请求缓存响应”是一个线索。

请求的服务器端缓存有两个部分。服务器必须在第一次请求URL时填充缓存。它将在第二次请求时提供缓存版本。注意错误消息何时显示,如果它在第一个或第二个请求上。这将告诉您它是否无法存储在缓存中,或者是否无法从缓存中检索它。

存储和存储的规则检索在此源代码文件中:https://github.com/aspnet/ResponseCaching/blob/3bf5f6a1ce69b65c998d6f5c739822a9bed4a67e/src/Microsoft.AspNetCore.ResponseCaching/Internal/ResponseCachingPolicyProvider.cs

您的“Cache-Control:public,max-age = 600”标题应该符合这些规则。

你已经找到了no-cache / no-store“gotcha”。还有一些其他的ResponseCaching需要注意:

经过身份验证的请求&使用set-cookie的响应不会被缓存。仅缓存使用GET或HEAD方法的请求。如果QueryString不同,它将创建一个新的缓存条目。此外,如果请求的某些条件与先前缓存的请求不同(例如:user-agent,accept-encoding等),通常您需要一个“Vary”标头来阻止缓存。

另一方面,尊重no-cache / no-store请求标头可能是一个糟糕的设计选择,因为ASP.Net Core的ResponseCache最有可能被拥有响应的服务器使用,而不是像中间缓存那样CDN / ISP。我已经扩展了基本的ResponseCache,并选择了禁用这些头文件(以及将缓存序列化为磁盘,而不是仅限内存)。它是默认缓存的简单替代品。

您可以在此处找到我的扩展程序:https://github.com/speige/AspNetCore.ResponseCaching.Extensions https://www.nuget.org/packages/AspNetCore.ResponseCaching.Extensions

答案 1 :(得分:-1)

HttpCacheHeader 不是缓存商店。

  

此中间件处理“后端” - 部分:它生成正确的缓存相关标头,并确保缓存可以检查到期(304 Not Modified)&前置条件(412 Precondition Failed)(通常用于并发检查)。

Source