2017-09-29 170 views
0

我从Visual Studio中的WebApi .Net Core 2.0模板创建了一个新的解决方案。 我在启动时添加了以下内容。ASP.NET Core 2.0 - Http响应缓存中间件 - 无缓存

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"]

注意,我确信,邮差不发送no-cache标题(在邮差设置)。

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

  • 缓存控制:公众,最大年龄= 600
  • 内容类型:应用程序/ JSON的;字符集= UTF-8
  • 日期:星期五,2017年9月29日14时02分29秒GMT
  • 的ETag:C5DFA8974BB722D27E71EE50D3D14625
  • 过期:星期五,2017年9月29日14时03分29秒GMT
  • 上次修改:周五,2017年9月29日14时02分29秒GMT
  • 服务器:红隼
  • 传输编码:分块
  • 各不相同:接受,接受语言,接受编码
  • X供电-者: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稍后会进行验证缓存以及到期缓存。

回答

-1

HttpCacheHeader不是缓存存储。

该中间件处理“后端” -part:它产生正确的高速缓存相关的头,并确保的高速缓存可以检查届满(304未修改)&先决条件(412前提条件失败)(通常用于并发检查)。

Source

+0

我从来没有说过它是。 ASP.NET ResponseCaching是,它不适用于HttpCacheHeaders。 –

0

这是怎样的一个非答案,一些故障排除技巧。

我试过你的确切代码&它对我来说工作得很好。也许在HttpCacheHeaders或ResponseCaching回购中修复了一个错误?

不幸的是,调试服务器端ResponseCaching是棘手的,因为它有奇怪的规则&没有足够的日志记录。当我过去遇到过类似的问题时,我不得不拉下微软的源代码以便通过它&找到我的代码的问题。

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

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

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

你的“缓存控制:公众,最大年龄= 600”标头应符合这些规则就好了。

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

已验证的请求&响应set-cookie不会被缓存。只有使用GET或HEAD方法的请求才会被缓存。如果QueryString不同,它将创建一个新的缓存条目。此外,如果请求的某些条件与先前缓存的请求不同(例如:用户代理,接受编码等),通常需要“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