.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调试日志获取更多细节:- 在
appsettings.json中添加日志配置:
{ "Logging": { "LogLevel": { "Microsoft.AspNetCore": "Debug", "System.Runtime": "Debug" } } }- 使用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
相关产品推荐
相关产品推荐

