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

.NET 7 OutputCache命名策略不生效及全局缓存问题排查

.NET 7 OutputCache 问题排查与解决

问题1:缓存对所有控制器端点生效(未添加[OutputCache]特性也被缓存)

根源是AddBasePolicy默认会对所有端点强制应用该策略,无论是否标记[OutputCache]特性。

解决方案

修改基础策略的配置,让它仅对显式添加[OutputCache]且未指定命名策略的端点生效:

.AddOutputCache(options =>
{
    options.AddBasePolicy(builder =>
        builder.Expire(TimeSpan.FromSeconds(5))
               // 仅当端点有[OutputCache]特性且未指定PolicyName时应用基础策略
               .WithPolicyPredicate(context => 
                   context.Endpoint.Metadata.OfType<OutputCacheAttribute>().Any() &&
                   string.IsNullOrEmpty(context.Endpoint.Metadata.OfType<OutputCacheAttribute>().First().PolicyName)));

    options.AddPolicy("DemoCache", builder =>
        builder.Expire(TimeSpan.FromSeconds(20)));
})

或者更简洁的方式,禁用基础策略的默认启用状态,仅当端点显式引用时生效:

.AddOutputCache(options =>
{
    options.AddBasePolicy(builder =>
        builder.Expire(TimeSpan.FromSeconds(5))
               .EnableByDefault(false));

    options.AddPolicy("DemoCache", builder =>
        builder.Expire(TimeSpan.FromSeconds(20)));
})

问题2:指定的"DemoCache"命名策略不生效,始终应用基础策略

这是因为基础策略默认全局生效,会与命名策略的配置产生叠加(过期时间取最严格规则),导致命名策略的配置被覆盖。

解决方案

采用上述修改基础策略的配置后,当端点指定[OutputCache(PolicyName = "DemoCache")]时,会优先应用命名策略,基础策略仅在未指定PolicyName的[OutputCache]端点上生效。

同时需确保中间件注册顺序正确:app.UseOutputCache()必须放在app.MapControllers()之前,否则缓存逻辑不会生效。

验证修改后的效果

  • GetElementNoCache方法:未添加[OutputCache]特性,不再被缓存。
  • GetElementCached方法:指定了"DemoCache"策略,会按照20秒过期规则缓存。
  • 若有其他添加[OutputCache]但未指定PolicyName的端点,会使用5秒过期的基础策略。

内容的提问来源于stack exchange,提问作者thewhiterose

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 16:33:15