IIS托管的.NET 6 MVC应用MemoryCache清除问题排查求助
.NET 6 MVC CMS MemoryCache清除不生效问题排查步骤
确认MemoryCache实例的单例性
.NET中MemoryCache是进程内缓存,必须保证全局使用同一个实例才能让清除操作生效。检查Program.cs中的注册逻辑,确保是单例注入:// 正确注册方式 builder.Services.AddMemoryCache();业务代码中必须通过依赖注入获取
IMemoryCache实例,禁止手动new MemoryCache()创建局部实例,否则清除的只是当前局部实例的缓存,其他请求的缓存不受影响。检查缓存清除逻辑的正确性
MemoryCache本身没有原生的Clear方法,若你自己实现了清除逻辑,需确保能遍历到所有目标缓存项。比如用统一前缀标记缓存键,再遍历删除:// 示例:删除所有带CMS前缀的缓存项 var allKeys = _memoryCache.GetCacheKeys(); // 需自定义扩展方法获取所有缓存键 foreach (var key in allKeys.Where(k => k.StartsWith("CMS_"))) { _memoryCache.Remove(key); }注意:若清除代码是在应用进程外执行(比如CI/CD发布脚本),根本无法触达应用内的MemoryCache,必须在应用进程内触发清除操作(比如发布后调用一个专门的接口)。
排查IIS应用池的重叠回收机制
IIS默认开启应用池重叠回收,发布时旧进程会继续处理未完成的请求,新进程并行启动,此时旧进程的缓存仍然有效,直到旧进程被回收。可以尝试关闭重叠回收:- 打开IIS管理器,找到对应应用池
- 右键→高级设置→回收→将「启用重叠回收」设为False
但这种方式会导致发布时短暂中断服务,更优的方案是在应用启动时自动清除缓存,确保新进程启动后缓存为空。
检查是否存在多级缓存
若应用或IIS开启了输出缓存,即便MemoryCache被清除,IIS的输出缓存仍会返回旧内容。排查点:- 控制器/Action是否添加了
[ResponseCache]特性,导致响应被缓存 - IIS站点的「输出缓存」设置是否启用了内核/用户模式缓存
如需清除IIS输出缓存,可在发布时执行以下命令:
# 先禁用再启用输出缓存,达到清除效果 appcmd.exe set config "你的站点名称" -section:system.webServer/caching /enabled:False /commit:apphost appcmd.exe set config "你的站点名称" -section:system.webServer/caching /enabled:True /commit:apphost- 控制器/Action是否添加了
验证清除代码的执行状态
在清除缓存的方法中添加日志,确认代码是否实际执行。比如:// 写入日志文件验证执行情况 var logPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "CacheClearLog.txt"); File.AppendAllText(logPath, $"缓存清除执行:{DateTime.Now:yyyy-MM-dd HH:mm:ss}{Environment.NewLine}");发布后查看日志,若未记录则说明清除代码未被触发,需检查触发逻辑(比如发布钩子的调用权限、接口是否被正确访问)。
内容的提问来源于stack exchange,提问作者Aman Tiwari
相关产品推荐
相关产品推荐

