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

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默认开启应用池重叠回收,发布时旧进程会继续处理未完成的请求,新进程并行启动,此时旧进程的缓存仍然有效,直到旧进程被回收。可以尝试关闭重叠回收:

    1. 打开IIS管理器,找到对应应用池
    2. 右键→高级设置→回收→将「启用重叠回收」设为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
    
  • 验证清除代码的执行状态
    在清除缓存的方法中添加日志,确认代码是否实际执行。比如:

    // 写入日志文件验证执行情况
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 07:03:29