如何在控制器中为[OutputCache]使用Tag,而非Minimal API
在ASP.NET Core控制器中为输出缓存添加Tag支持
你可以通过两种方式在控制器中实现带Tag的输出缓存,无需迁移到Minimal API:
方法一:通过输出缓存策略配置Tag
这种方式利用框架自带的策略配置,把Tag和缓存规则绑定在一起:
- 在
Program.cs中注册输出缓存并定义带Tag的策略:
builder.Services.AddOutputCache(options => { options.AddPolicy("PeopleCache", policy => { policy.Tag("people"); // 设置缓存标签 policy.Expire(TimeSpan.FromMinutes(10)); // 可选:设置缓存过期时间 }); }); // 启用输出缓存中间件 app.UseOutputCache();
- 在控制器Action上引用这个策略:
[ApiController] [Route("api/people")] public class PeopleController : ControllerBase { [HttpGet] [CacheOutput(PolicyName = "PeopleCache")] public IActionResult GetAll() { // 业务逻辑:返回人员列表 return Ok(new List<Person> { new Person { Id = 1, Name = "John Doe" } }); } }
方法二:自定义带Tag参数的缓存特性
如果想要更灵活地直接在Action上指定Tag,可以自定义特性:
- 创建自定义特性类,实现
IOutputCachePolicyProvider接口:
public class TagCacheOutputAttribute : Attribute, IOutputCachePolicyProvider { public string Tag { get; set; } = string.Empty; public TimeSpan? Expiration { get; set; } = TimeSpan.FromMinutes(5); public ValueTask<IOutputCachePolicy?> GetPolicyAsync(OutputCachePolicyContext context, CancellationToken cancellationToken) { var policy = new OutputCachePolicy(); policy.Tag(Tag); if (Expiration.HasValue) policy.Expire(Expiration.Value); return ValueTask.FromResult<IOutputCachePolicy?>(policy); } }
- 在控制器Action上直接使用这个自定义特性:
[HttpGet("{id}")] [TagCacheOutput(Tag = "people", Expiration = TimeSpan.FromMinutes(15))] public IActionResult GetById(int id) { // 业务逻辑:返回指定人员信息 return Ok(new Person { Id = id, Name = "Jane Smith" }); }
清除指定Tag的缓存
无论使用哪种方式,都可以通过注入IOutputCacheStore来清除对应Tag的缓存:
public class CacheCleanupService { private readonly IOutputCacheStore _cacheStore; public CacheCleanupService(IOutputCacheStore cacheStore) { _cacheStore = cacheStore; } public async Task ClearPeopleCache() { await _cacheStore.EvictByTagAsync("people", CancellationToken.None); } }
内容的提问来源于stack exchange,提问作者Baran
相关产品推荐
相关产品推荐

