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

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

我试图了解 .NET Core 3.1 中的响应缓存。但它没有如我所愿。我在 Chrome devtool 中查看了网络,它显示了带有 cache-control: no-cache, no-store 的响应头.
我还发现响应头是 HeaderCacheControl{public,max-age=100}在 Action 过滤器中。这是我期望的值,但浏览器中的实际响应头是 no-cache .Startup类(class):

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?}");
    });
}
Controller :
[ResponseCache(Duration = 100, NoStore = false)]
public IActionResult Index()
{
   
    return View();
}

最佳答案

这是正常行为,如果页面是否从磁盘缓存中检索,则有多种因素会起作用。
我将尝试列出用户请求页面以及它是否被缓存的常见场景。

  • AddResponseCachingUseResponseCaching控制服务器端缓存 ResponseCacheAttribute通过设置适当的 header 来控制客户端缓存。

  • 我喜欢控制客户端缓存的方式是通过设置如下配置文件:
    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带有服务器尊重的请求的 header 。
  • 如果您想测试缓存是否真的有效,请执行以下操作:
  • 打开您的 Chrome 开发工具并取消选中 Disable cache复选框如果它被选中。
  • 像往常一样请求您的页面。
  • 不要尝试通过页面中引用同一页面的 anchor 标记请求同一页面(您应该看到该页面是从磁盘缓存中检索的)(如果遵守以下条件)。
  • 您也可以从另一个页面导航到您的(缓存激活)页面,如果它被缓存,它将从磁盘缓存中拉出(如果满足以下条件)。

  • 带有表单和/或任何类型的授权的页面不会被缓存。包含防伪 token 的页面将与 Cache-Control 一起发送和 Pragma标题到 no-cache .您可以在 MSDN 上看到缓存的所有条件。 .
  • 还有一些工具如 Fiddler 和 Postman 发送 no-cache默认标题。
  • 关于c# - ResponseCache 在网络核心 3.1 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64413717/

    相关文章:

    c# - 静态成员会被垃圾收集吗?

    c# - xml空标签反序列化

    .net - 处理 .NET 中的浮点错误

    c# - 如何在加载表单后执行代码?

    c# - 如何在 WPF 中将 ItemsSource 与 ObservableCollection 绑定(bind)

    c# - 没有登录控件的 ASP.NET 登录表单例份验证

    c# - EF6 Linq 查询。仅包括返回子表的第一个条目

    spring - @Cachebale 不适用于 Ehcache 和 spring MVC Ehcache 不适用于 Spring 缓存注释

    asp.net - 如何在 ASP.NET 3.5 中对每个 http 请求进行缓存

    java - 静态缓存 - 两个 "Instances"