ResponseCache 在网络核心 3.1 中不起作用

Yu *_*Hsu 3 .net c# browser caching .net-core

我尝试了解 .NET Core 3.1 中的响应缓存。但它并没有如我所愿。我在 Chrome devtool 中查看了网络,它显示了带有cache-control: no-cache, no-store.

\n

我还发现 Response headerHeaderCacheControl{public,max-age=100}在 Actionfilter 中。这是我期望的值,但浏览器中的实际响应标头是no-cache.

\n

Startup类\xef\xbc\x9a

\n
public void ConfigureServices(IServiceCollection services)\n{\n    services.AddResponseCaching(options=> \n    {\n        options.SizeLimit = 1024;\n        options.MaximumBodySize = 1024 * 1024 * 100;\n        options.UseCaseSensitivePaths = false;\n    });\n}\n\npublic void Configure(IApplicationBuilder app, IWebHostEnvironment env)\n{   \n    if (env.IsDevelopment())\n    {\n        app.UseDeveloperExceptionPage();\n    }\n    app.UseCookiePolicy();\n    app.UseStaticFiles();\n    app.UseRouting();\n    app.UseAuthentication();\n    app.UseAuthorization();\n    app.UseResponseCaching();\n    app.UseEndpoints(endpoints =>\n    {\n        endpoints.MapControllerRoute(\n            name: "default", \n            pattern: "{controller=Home}/{action=Index}/{id?}");\n    });\n}\n
Run Code Online (Sandbox Code Playgroud)\n

控制器:

\n
[ResponseCache(Duration = 100, NoStore = false)]\npublic IActionResult Index()\n{\n   \n    return View();\n}\n
Run Code Online (Sandbox Code Playgroud)\n

HMZ*_*HMZ 5

这是正常行为,如果页面是否从磁盘缓存中检索,则有多个因素会影响。

我将尝试列出用户请求页面的常见场景以及该页面是否被缓存。

  1. AddResponseCachingUseResponseCaching控制服务器端缓存,同时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
    });

})
Run Code Online (Sandbox Code Playgroud)

你这样使用它:

[ResponseCache(CacheProfileName = "Caching")]
Run Code Online (Sandbox Code Playgroud)
  1. 当使用没有证书的 HTTPS 或证书无效时,Chrome 会阻止任何类型的缓存(在开发中,系统会提示您信任开发证书,以便通过 HTTPS 进行工作)

  2. 当开发工具打开时,浏览器会禁用缓存,它们通常会发送一个Cache-Control: no-cache

  3. 在 chrome 上点击重新加载 (Ctrl + F5) 也会禁用缓存并发送Cache-Control: max-age=0包含您的请求的标头,该标头会受到服务器的尊重。

  4. 如果您想测试缓存是否确实有效,请执行以下操作:

    1. 打开 Chrome 开发工具并取消选中该Disable cache复选框(如果已选中)。

    2. 像平常一样请求您的页面。

    3. 不要尝试通过页面中引用同一页面的锚标记请求同一页面(您应该看到该页面是从磁盘缓存中检索的)(如果满足以下条件)。

    4. 您还可以从另一个页面导航到您的(已激活缓存)页面,如果已缓存,则会从磁盘缓存中提取该页面(如果满足以下条件)。

  5. 带有表单和/或任何类型授权的页面将不会被缓存。包含防伪令牌的页面将通过Cache-ControlPragma标头发送到no-cache你可以在MSDN上看到所有缓存的条件。

  6. 还有一些工具,如 Fiddler 和 Postman,no-cache默认发送标头。

  • 非常感谢。我的问题的解决方案是您的场景列表中的第六点。当我注释掉“Form”和防伪令牌时,效果很好。 (3认同)