【问题标题】:When is C# Web API response caching turned on by default in .NET Core projects?.NET Core 项目中什么时候默认打开 C# Web API 响应缓存?
【发布时间】:2023-01-04 03:06:26
【问题描述】:

我对 C# 属性 [ResponseCache] 的理解(我认为)它使用请求和请求标头作为键,然后将响应缓存在内存中。这对于图像、CSS 等静态内容显然是有意义的。这对于从不静态且总是变化的 API 请求显然没有意义。

这是 Microsoft 所说的 C# Web API 响应缓存的链接 https://learn.microsoft.com/en-us/aspnet/core/performance/caching/response?view=aspnetcore-6.0

从文档中我可以看到我可以通过以下方式禁用对缓存没有意义的内容的网络缓存:

[ResponseCache(NoStore = true, Location = ResponseCacheLocation.None)]
[HttpGet(api/GetRandomNumber/{seed}}

我看到您还可以通过以下示例将其显式添加到中间件以启用它:

app.UseResponseCaching();

app.Use(async (context, next) =>
{
    context.Response.GetTypedHeaders().CacheControl =
        new Microsoft.Net.Http.Headers.CacheControlHeaderValue()
        {
            Public = true,
            MaxAge = TimeSpan.FromSeconds(10)
        };
    context.Response.Headers[Microsoft.Net.Http.Headers.HeaderNames.Vary] =
        new string[] { "Accept-Encoding" };

    await next();
});

我们的基准测试表明,在我们不知情(或任何启用它的代码)的情况下,似乎默认情况下启用了响应缓存。当我们将属性添加到经过身份验证的 API 调用时,内存使用率下降了一半。

[ResponseCache(NoStore = true, Location = ResponseCacheLocation.None)]

问题是。响应缓存在什么情况下默认开启?如果我们没有向任何东西添加 ResponseCache 属性,并且我们没有调用 app.UseResponseCaching() - 怎么可能启用响应缓存?

【问题讨论】:

    标签: c# asp.net-core .net-core asp.net-core-webapi


    【解决方案1】:

    我检查了一些使用 .Net 6 构建的 API 服务器,它们都没有返回任何与缓存相关的标头。听起来你有一些东西正在打开缓存,以及添加一个全局过滤器来为所有端点启用缓存。

    【讨论】:

      【解决方案2】:

      您可以在适用于我的 API 控制器类中使用以下代码行

      [ResponseCache(Location = ResponseCacheLocation.None, Duration = 0, NoStore = true)]

      此外,对于基于 MVC 的应用程序,您可以使用以下代码行 -

      builder.Services.AddControllersWithViews().AddMvcOptions(options => 
          options.Filters.Add(
              new ResponseCacheAttribute
              {
                  NoStore = true, 
                  Location = ResponseCacheLocation.None,
                  Duration = 0
              }));

      【讨论】:

      • 我知道如何禁用它。问题是什么时候默认启用?它总是默认启用吗?这没有回答问题,它实际上是我们所说的我们已经做过的事情的复制粘贴?
      猜你喜欢
      • 2017-11-23
      • 2018-02-08
      • 2021-11-08
      • 2022-11-14
      • 1970-01-01
      • 2022-11-25
      • 1970-01-01
      • 2018-05-23
      • 2019-03-11
      相关资源
      最近更新 更多