我在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缓存标头。所以我的端点响应头是:
问题是没有任何东西被缓存。 Ouput
窗口仅显示The response could not be cached for this request.
所以我对如何使用ASP.NET Core ResponseCaching Middleware
感到有点迷失。
更新的
如果我不使用HttCacheHeaders
服务但是将[ResponseCache(Duration = 600)]
添加到我的控制器的操作中,则缓存可以正常工作。
请注意,我要使用HttCacheHeaders
的原因是ETag
和Last-Modified
稍后执行验证缓存以及到期缓存。
答案 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)(通常用于并发检查)。