我在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
的原因是 ETag
和 Last-Modified
以后执行验证缓存以及到期缓存 .
2 回答
这是一种非答案,有一些故障排除技巧 .
我尝试了你的确切代码,它对我来说很好 . 也许在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
HttpCacheHeader
is not 缓存商店 .Source