首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ResponseCache未在净核心3.1中工作

ResponseCache未在净核心3.1中工作
EN

Stack Overflow用户
提问于 2020-10-18 13:09:23
回答 1查看 2.9K关注 0票数 3

我试着在.NET Core3.1中学习响应缓存。但这不像我所希望的那样有效。我在Chrome中查看了网络,它用cache-control: no-cache, no-store显示了响应头。

我还发现响应头与Actionfilter中的HeaderCacheControl{public,max-age=100}一起使用。这是我所期望的值,但浏览器中的实际响应头是no-cache

Startup类:

代码语言:javascript
复制
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?}");
    });
}

主计长:

代码语言:javascript
复制
[ResponseCache(Duration = 100, NoStore = false)]
public IActionResult Index()
{
   
    return View();
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-19 14:20:20

这是正常行为,如果从磁盘缓存或不从磁盘缓存检索页面,会有多个因素在发挥作用。

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

  1. AddResponseCachingUseResponseCaching控制服务器端缓存,而ResponseCacheAttribute通过设置适当的头来控制客户端缓存。

我喜欢控制客户端缓存的方式是设置配置文件,如下所示:

代码语言:javascript
复制
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
    });

})

你就这样用它:

代码语言:javascript
复制
[ResponseCache(CacheProfileName = "Caching")]
  1. 当使用没有证书的HTTPS或证书无效时,Chrome阻止任何类型的缓存(在开发过程中,提示您信任开发证书以便在HTTPS上工作)
  2. 浏览器在打开dev工具时禁用缓存,通常会发送Cache-Control: no-cache
  3. 点击chrome (Ctrl + F5)上的重载(Ctrl+F5)也会禁用缓存,并在请求中发送一个Cache-Control: max-age=0报头,这是服务器所尊重的。
  4. 如果希望测试缓存是否有效,请执行以下操作:
代码语言:javascript
复制
1. Open your Chrome dev tools and uncheck the `Disable cache` checkbox if it's checked.
代码语言:javascript
复制
2. Request your page like you normally would.
代码语言:javascript
复制
3. Not try to request the same page via an anchor tag in the page that reference the same page (you should see that the page is retrieved from disk cache) (if the conditions below are respected).
代码语言:javascript
复制
4. Also you can navigate to your (cache activated) page from another page, if it's cached it will be pulled from the disk cache (if the conditions below are respected).
  1. 不缓存具有窗体和/或任何类型授权的页面。包含防伪令牌的页面将与Cache-ControlPragma头一起发送到no-cache。您可以看到在MSDN上缓存的所有条件。
  2. 还有一些工具,如Fiddler和Postman,默认情况下发送no-cache头。
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64413717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档