首页 文章

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

提问于
浏览
1

我在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 ,这是由模板创建的 endpoints ,并返回 ["value1","value2"]

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

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

  • Cache-Control:public,max-age = 600

  • Content-Type:application / json;字符集= utf-8的

  • 日期:星期五,29九月2017 14:02:29 GMT

  • ETag:C5DFA8974BB722D27E71EE50D3D14625

  • 到期日:2017年9月29日星期五14:03:29 GMT

  • Last-Modified:星期五,29九月2017 14:02:29 GMT

  • 服务器:红隼

  • Transfer-Encoding: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 感到有点迷茫 .

Update

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

2 回答

  • -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” Headers 应该符合这些规则 .

    你已经找到了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

    HttpCacheHeader is not 缓存商店 .

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

    Source

相关问题