.NET 6 API触发System.InvalidProgramException异常求排查方案
排查服务生命周期冲突
异常触发于服务解析环节,且存在“2次正常请求后报错”的规律,优先检查单例服务是否依赖了瞬态/范围服务。单例服务会长期持有依赖实例,而范围服务在请求结束后会被回收,后续请求使用时会出现无效状态,进而引发CLR检测到无效程序的异常。逐一核对单例注册服务的构造函数注入项,确认依赖服务的生命周期是否匹配。修正中间件服务注入方式
中间件默认是单例生命周期,若在构造函数中直接注入范围服务,会导致生命周期不兼容。正确做法是在Invoke方法内通过context.RequestServices.GetRequiredService<T>()获取范围服务,而非构造函数注入。核查依赖版本一致性
尽管已更新NuGet包,仍可能存在间接依赖版本冲突。执行以下命令查看完整依赖树:dotnet list package --include-transitive重点确认
Microsoft.Extensions.DependencyInjection及关联依赖(如Microsoft.Extensions.DependencyInjection.Abstractions)在所有项目中版本统一,排除版本不兼容导致的IL代码生成异常。清理编译与构建缓存
编译生成的中间文件损坏可能导致CLR加载无效程序集:- 删除所有项目的
bin、obj目录 - 执行
dotnet clean和dotnet restore重新编译项目 - Docker环境下,添加
--no-cache参数重新构建镜像,清除构建缓存
- 删除所有项目的
排查服务注册逻辑
若服务注册使用了动态代码生成(如表达式树、Emit)或自定义DI扩展,可能存在代码生成错误导致IL无效。暂时简化服务注册逻辑,逐步添加服务,定位引发异常的注册项。启用CLR详细日志
在Program.cs中添加配置获取更详细的异常上下文:// 启用DI调试日志 builder.Logging.AddFilter("Microsoft.Extensions.DependencyInjection", LogLevel.Debug);或在
appsettings.json中调整日志级别:{ "Logging": { "LogLevel": { "Microsoft.Extensions.DependencyInjection": "Debug", "System": "Debug" } } }
内容的提问来源于stack exchange,提问作者Swirlas

