为了实现响应缓存,需要做的是:
- 将
.AddResponseCaching()
注入服务, - 用
[ResponseCache(Duration = 10)]
修饰控制器动作
现在我正在尝试。net 6带来的最小api,我还没有找到一种方法来做到这一点,除了自己添加标题cache-control: public,max-age=10
。
有更优雅的方式吗?
ResponseCacheAttribute
是MVC的一部分,根据文档将应用于:
- Razor Pages:属性不能应用于处理程序方法。
- 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
。. NET 7更新
对于。net 7,您可以配置输出缓存(请参阅链接的文章,了解与响应缓存的区别):
输出缓存中间件可以在所有类型的ASP中使用。. NET Core应用:Minimal API,带有控制器的Web API, MVC和Razor Pages。
输出缓存可以通过OutputCacheAttribute
或CacheOutput
方法调用来实现:
app.MapGet("/cached", Gravatar.WriteGravatar).CacheOutput();
app.MapGet("/attribute", [OutputCache] (context) => Gravatar.WriteGravatar(context));
或者对于通过策略的多个端点:
下面的代码为应用的所有端点配置缓存,过期时间为10秒。
builder.Services.AddOutputCache(options =>
{
options.AddBasePolicy(builder => builder.Expire(TimeSpan.FromSeconds(10)));
});