0

为了实现响应缓存,需要做的就是:

  • 注入.AddResponseCaching()服务,
  • 用 . 装饰控制器动作[ResponseCache(Duration = 10)]

现在我正在尝试 .NET 6 附带的最小 API,除了自己添加标头之外,我还没有想出办法做到这一点cache-control: public,max-age=10

有没有更优雅的方式来做到这一点?

4

1 回答 1

2

ResponseCacheAttribute是 MVC 的一部分,根据文档将应用于:

  • Razor 页面:属性不能应用于处理程序方法。
  • MVC 控制器。
  • MVC 操作方法:方法级属性覆盖类级属性中指定的设置。

因此,似乎自己添加缓存标头是唯一的选择。如果您愿意,可以使用自定义中间件稍微“美化”它。沿着这条线的东西:

class CacheResponseMetadata
{
// add configuration properties if needed
}

class AddCacheHeadersMiddleware
{
    private readonly RequestDelegate _next;

    public AddCacheHeadersMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext httpContext)
    {
        if (httpContext.GetEndpoint()?.Metadata.GetMetadata<CacheResponseMetadata>() is { } mutateResponseMetadata)
        {
            if (httpContext.Response.HasStarted)
            {
                throw new InvalidOperationException("Can't mutate response after headers have been sent to client.");
            }
            httpContext.Response.Headers.CacheControl = new[] { "public", "max-age=100" };
        }
        await _next(httpContext);
    }
}

和用法:

app.UseMiddleware<AddCacheHeadersMiddleware>(); // optionally move to extension method 
app.MapGet("/cache", () => $"Hello World, {Guid.NewGuid()}!")
    .WithMetadata(new CacheResponseMetadata()); // optionally move to extension method
于 2021-10-28T13:19:12.167 回答