【问题标题】:ASP.NET Core 2.0 - Http Response Caching Middleware - Nothing cachedASP.NET Core 2.0 - Http 响应缓存中间件 - 没有缓存
【发布时间】:2018-03-11 14:09:21
【问题描述】:

我在 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 缓存标头。所以我的端点响应头是:

  • 缓存控制:public,max-age=600
  • 内容类型:应用程序/json; charset=utf-8
  • 日期:格林威治标准时间 2017 年 9 月 29 日星期五 14:02:29
  • ETag:C5DFA8974BB722D27E71EE50D3D14625
  • 到期:格林威治标准时间 2017 年 9 月 29 日星期五 14:03:29
  • 最后修改时间:格林威治标准时间 2017 年 9 月 29 日星期五 14:02:29
  • 服务器:红隼
  • 传输编码:分块
  • 变化:接受、接受语言、接受编码
  • 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 稍后进行验证缓存和过期缓存。

【问题讨论】:

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


    【解决方案1】:

    这是一个没有答案的问题,有一些故障排除提示。

    我尝试了您的确切代码,它对我来说效果很好。也许在 HttpCacheHeaders 或 ResponseCaching 存储库中修复了一个错误?

    不幸的是,调试服务器端 ResponseCaching 很棘手,因为它有奇怪的规则并且没有足够的日志记录。当我过去遇到过类似的问题时,我不得不下载 Microsoft 的源代码来单步执行它并找到我的代码的问题。

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

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

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

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

    您已经找到了无缓存/无存储“陷阱”。还有一些其他的 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.Extensionshttps://www.nuget.org/packages/AspNetCore.ResponseCaching.Extensions

    【讨论】:

      【解决方案2】:

      HttpCacheHeader 不是缓存存储。

      此中间件处理“后端”部分:它生成正确的缓存相关标头,并确保缓存可以检查过期(304 未修改)和前置条件(412 前置条件失败)(通常用于并发检查)。

      Source

      【讨论】:

      • 我从来没有说过。 ASP.NET ResponseCaching 是,它不适用于 HttpCacheHeaders。
      猜你喜欢
      • 2018-02-08
      • 1970-01-01
      • 2022-11-17
      • 1970-01-01
      • 2018-03-26
      • 2011-03-25
      • 1970-01-01
      • 2018-06-22
      相关资源
      最近更新 更多