c# - ResponseCache 在网络核心 3.1 中不起作用
问题描述
我试图了解 .NET Core 3.1 中的响应缓存。但它并没有如我所愿。我在 Chrome devtool 中查看了网络,它显示了带有cache-control: no-cache, no-store
.
我还发现 Response 标头HeaderCacheControl{public,max-age=100}
在 Actionfilter 中。这是我预期的值,但浏览器中的实际响应标头是no-cache
.
Startup
班级:</p>
public void ConfigureServices(IServiceCollection services)
{
services.AddResponseCaching(options=>
{
options.SizeLimit = 1024;
options.MaximumBodySize = 1024 * 1024 * 100;
options.UseCaseSensitivePaths = false;
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseCookiePolicy();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseResponseCaching();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
控制器:
[ResponseCache(Duration = 100, NoStore = false)]
public IActionResult Index()
{
return View();
}
解决方案
这是正常行为,如果页面是否从磁盘缓存中检索到,则有多种因素在起作用。
我将尝试列出用户请求页面的常见场景以及它是否被缓存。
AddResponseCaching
并通过设置适当的标头UseResponseCaching
控制服务器端缓存,同时控制客户端缓存。ResponseCacheAttribute
我喜欢控制客户端缓存的方式是设置如下配置文件:
services.AddControllersWithViews(options =>
{
options.CacheProfiles.Add("Caching", new CacheProfile()
{
Duration = 120,
Location = ResponseCacheLocation.Any,
VaryByHeader = "cookie"
});
options.CacheProfiles.Add("NoCaching", new CacheProfile()
{
NoStore = true,
Location = ResponseCacheLocation.None
});
})
你像这样使用它:
[ResponseCache(CacheProfileName = "Caching")]
当使用没有证书的 HTTPS 或证书无效时,Chrome 会阻止任何类型的缓存(在开发中,系统会提示您信任开发证书以便通过 HTTPS 工作)
浏览器在开发工具打开时禁用缓存,它们通常发送一个
Cache-Control: no-cache
在 chrome (Ctrl + F5) 上点击重新加载也会禁用缓存并发送一个
Cache-Control: max-age=0
包含服务器尊重的请求的标头。如果您想测试您的缓存是否真的有效,请执行以下操作:
打开您的 Chrome 开发工具并取消选中该
Disable cache
复选框(如果已选中)。像往常一样请求您的页面。
不要尝试通过引用同一页面的页面中的锚标记请求同一页面(您应该看到该页面是从磁盘缓存中检索的)(如果遵守以下条件)。
您也可以从另一个页面导航到您的(缓存激活)页面,如果它被缓存,它将从磁盘缓存中提取(如果遵守以下条件)。
带有表单和/或任何类型的授权的页面不会被缓存。包含 Antiforgery 令牌的页面将与
Cache-Control
和Pragma
headers 一起发送到no-cache
. 您可以在MSDN上查看缓存的所有条件。还有一些工具,如 Fiddler 和 Postman
no-cache
,默认发送标头。
推荐阅读
- pine-script - Is it possible to retrieve the current bar's color?
- pine-script - Plotting Arrow when Price Passes Indicator Line
- excel - Error handling when 'getElementById' can't find object/value
- yarnpkg - 我如何在 Yarn 2 中共享工作区中的公共依赖项?
- python - 在不更改字符的情况下查找包含子字符串的列表中的所有名称
- python - Keras,使用 model.predict 访问带有 spektral GCN 的中间层输出时的行为不一致
- selenium - SendKeys 仅将文本注入输入字段几秒钟,然后文本立即从输入字段中消失
- sql - 访问交叉表多行作为列标题?
- python - How to calculate sum of two event till the condition breaks in Python? I am new to python
- python - 在 Python 中使用模拟来确定概率序列