.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
相关产品推荐
相关产品推荐

