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

.NET Core 3.1依赖注入触发System.InvalidProgramException排查求助

排查思路与解决方案
  • 检查依赖注入生命周期冲突
    异常仅在第三次调用时触发,大概率和服务生命周期不匹配有关。如果两个依赖的生命周期不一致(比如一个是Scoped,另一个是Singleton),当Singleton服务引用Scoped服务时,会导致后续请求中Scoped服务的状态异常,触发CLR的无效程序检测。
    检查Startup.cs中的服务注册代码,确认两个依赖的生命周期配置:

    // 示例:查看服务注册是否存在生命周期不匹配
    services.AddScoped<IFirstDependency, FirstDependency>();
    services.AddSingleton<ISecondDependency, SecondDependency>();
    

    若存在Singleton依赖引用Scoped依赖的情况,可调整两者生命周期为一致(比如都设为Scoped),或在Singleton服务中通过IServiceScopeFactory动态创建Scoped服务实例。

  • 排查MongoDB Driver的上下文复用问题
    结合MongoDriver的使用场景,需检查依赖中MongoDB相关对象的生命周期与复用逻辑:

    • 官方推荐IMongoDatabase以Singleton方式注册,避免重复创建连接;而IMongoCollection实例应在Scoped服务中按需获取,不要在Singleton服务中缓存请求级别的集合操作对象。
    • 检查依赖中是否存在未正确释放的异步操作资源(比如未完成的MongoDB查询),这类资源可能导致后续请求的上下文状态混乱。
  • 启用CLR详细调试日志
    当前异常信息不足,可通过启用CLR调试日志获取更多细节:

    1. 在appsettings.json中添加日志配置:
    {
      "Logging": {
        "LogLevel": {
          "Microsoft.AspNetCore": "Debug",
          "System.Runtime": "Debug"
        }
      }
    }
    
    1. 使用Visual Studio附加调试器,启用「启用.NET Framework源代码步进」选项,捕获异常时查看完整调用栈,定位到具体触发异常的方法或代码块。
  • 对比异常服务与正常服务的实现差异
    既然其他AppServices使用相同依赖组合无异常,重点对比异常控制器对应的AppService实现:

    • 检查是否存在特殊的异步逻辑、延迟初始化或静态变量复用逻辑,这些可能在多次调用后累积异常状态。
    • 尝试逐步简化该AppService的代码,定位到触发异常的具体业务逻辑块。
  • 验证MongoDB Driver版本兼容性
    .NET Core 3.1与部分MongoDB Driver版本可能存在兼容性问题,即使更新了DI相关包,MongoDriver版本也可能是诱因。尝试切换到与.NET Core 3.1兼容的稳定版本(如2.11.x系列),验证是否解决异常。

内容的提问来源于stack exchange,提问作者Wagner Meira Barbosa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 13:30:44