如何在.net 6中使用最小的api实现响应缓存?



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

  • .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。

输出缓存可以通过OutputCacheAttributeCacheOutput方法调用来实现:

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)));
});

相关内容

  • 没有找到相关文章

最新更新