.NET 8 Minimal API清除Output Cache无效问题咨询
以下是可能导致你清除缓存后仍有缓存结果的几个常见问题,以及对应的解决思路:
中间件顺序搞反了
必须确保app.UseOutputCache()在所有端点映射之前注册。如果你的/purge端点或者Carter模块的映射在UseOutputCache之前,清除缓存的操作就没法正确作用到Output Cache的存储上。正确的启动顺序应该是:// 先注册Output Cache中间件 app.UseOutputCache(); // 再映射所有端点 app.MapCarter(); app.MapPost("/purge/{tag}", async (IOutputCacheStore cache, string tag) => { await cache.EvictByTagAsync(tag, default); });API版本号导致缓存键关联问题
你的客户端端点带有{version:apiVersion}路由参数,缓存生成的键会包含这个版本信息。虽然标签是全局标记,但如果清除操作没有正确关联到对应版本的缓存条目,就会出现清除无效的情况。你可以尝试在purge端点里也加入版本参数,或者用IOutputCacheKeyProvider来查看生成的缓存键,确认标签是否正确绑定。试试用IOutputCacheManager替代直接操作存储
直接调用IOutputCacheStore的清除方法可能存在底层实现的细节问题,换成更高层的IOutputCacheManagerAPI更可靠:app.MapPost("/purge/{tag}", async (IOutputCacheManager cacheManager, string tag) => { await cacheManager.EvictByTagAsync(tag, default); });标签拼写不一致
检查代码里的标签字符串是否完全一致:缓存策略里的Tag("tag-client")和purge时传入的tag-client要确保大小写、连字符完全匹配,因为字符串比较是区分大小写的。验证缓存是否真的没被清除
可以临时修改GetClient方法的返回值(比如加个随机后缀),清除缓存后再次请求,如果返回的还是旧值,说明缓存确实没被清除;如果返回新值,那可能是调试断点的问题(比如调试器没及时更新断点状态)。
内容的提问来源于stack exchange,提问作者awj

