为了实现响应缓存,需要做的就是:
- 注入
.AddResponseCaching()
服务, - 用 . 装饰控制器动作
[ResponseCache(Duration = 10)]
。
现在我正在尝试 .NET 6 附带的最小 API,除了自己添加标头之外,我还没有想出办法做到这一点cache-control: public,max-age=10
。
有没有更优雅的方式来做到这一点?
为了实现响应缓存,需要做的就是:
.AddResponseCaching()
服务,[ResponseCache(Duration = 10)]
。现在我正在尝试 .NET 6 附带的最小 API,除了自己添加标头之外,我还没有想出办法做到这一点cache-control: public,max-age=10
。
有没有更优雅的方式来做到这一点?
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