【问题标题】:ResponseCache not working in net core 3.1ResponseCache 在网络核心 3.1 中不起作用
【发布时间】:2021-02-01 10:12:45
【问题描述】:

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

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

Startup类:

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();
}

【问题讨论】:

  • 你的管道顺序不对,你在UseEndpoints之前没有使用ResponseCaching中间件。并且提供静态文件和路由必须发生在身份验证和授权之前。
  • 谢谢。我听从了您的建议并修复了中间件的顺序。还在文档中找到了信息(docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware/…)。但是,修复后我仍然得到“无缓存,无存储”。

标签: c# .net caching .net-core browser


【解决方案1】:

这是正常行为,如果页面是否从磁盘缓存中检索到,有多种因素会起作用。

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

  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
    });

})

然后你像这样使用它:

[ResponseCache(CacheProfileName = "Caching")]
  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”和 Antiforgery 令牌时,效果很好。
  • @YuHsu 如果此答案解决了您的问题,请将其标记为已接受的答案。
猜你喜欢
  • 2020-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-15
  • 2018-04-04
  • 1970-01-01
相关资源
最近更新 更多