You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在控制器中为[OutputCache]使用Tag,而非Minimal API

在ASP.NET Core控制器中为输出缓存添加Tag支持

你可以通过两种方式在控制器中实现带Tag的输出缓存,无需迁移到Minimal API:

方法一:通过输出缓存策略配置Tag

这种方式利用框架自带的策略配置,把Tag和缓存规则绑定在一起:

  1. 在Program.cs中注册输出缓存并定义带Tag的策略:
builder.Services.AddOutputCache(options =>
{
    options.AddPolicy("PeopleCache", policy =>
    {
        policy.Tag("people"); // 设置缓存标签
        policy.Expire(TimeSpan.FromMinutes(10)); // 可选:设置缓存过期时间
    });
});

// 启用输出缓存中间件
app.UseOutputCache();
  1. 在控制器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,可以自定义特性:

  1. 创建自定义特性类,实现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);
    }
}
  1. 在控制器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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 12:05:32