ASP.NET Core2.1升2.2报错无法实例化ActionDescriptorCollectionProvider
问题根因
两个报错本质都是ASP.NET Core 2.1到2.2版本内部实现变更、迁移步骤遗漏导致的:
- 手动注册
IActionDescriptorCollectionProvider抛实例化错误的原因:2.2版本中ActionDescriptorCollectionProvider类的访问修饰符从2.1的public改为了internal,依赖注入容器无法反射创建内部访问级别的类型实例,自然抛出ArgumentException。且该服务在2.2中会由MVC框架自动注册,完全不需要手动添加。 - 注释掉该行后启动崩溃无明确报错的原因:大概率没有完成MVC服务的2.2版本适配配置,导致框架默认注册的
IActionDescriptorCollectionProvider依赖的其他核心服务缺失,触发框架层未处理异常;VS默认开启"仅我的代码"调试时,就会只显示线程在外部代码执行的中断提示,看不到具体异常堆栈。
解决步骤
- 直接删除
services.AddSingleton<IActionDescriptorCollectionProvider, ActionDescriptorCollectionProvider>();这行手动注册代码,不要保留。 - 检查
ConfigureServices方法中的MVC注册逻辑,将原有services.AddMvc()替换为带2.2兼容版本的写法,确保框架完成所有内部服务的默认注册:
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
注:IHttpContextAccessor在2.2版本中也会随MVC服务自动注册,代码里手动注册这行可以保留也可以删除,不会造成冲突。
- 检查项目文件(.csproj)中对共享框架元包
Microsoft.AspNetCore.App的引用,2.2版本下不要给该包指定版本号,避免SDK自动解析的版本和引用包版本不匹配导致服务注册缺失,正确写法如下:
<PackageReference Include="Microsoft.AspNetCore.App" />
- 完成以上修改后如果仍然启动崩溃,先打开VS的「异常设置」面板,勾选公共语言运行时异常的「引发时中断」选项,同时关闭调试设置里的启用仅我的代码,再次启动调试就能直接捕获到最原始的异常堆栈,定位具体缺失的依赖或配置问题,不会再出现无代码可看的中断提示。
额外迁移提示
2.2版本对MVC内部基础设施层做了大量重构,所有Microsoft.AspNetCore.Mvc.Infrastructure命名空间下的内部服务(包括IActionSelector、IActionInvokerFactory等)都不建议再手动注册替换,这类服务的实现访问级别、依赖项、生命周期都可能和2.1不同,手动注册非常容易出现冲突。如果有自定义Action描述、选择逻辑的需求,推荐通过实现IActionDescriptorProvider、IApplicationModelConvention等扩展点完成,不需要替换整个默认服务。
内容的提问来源于stack exchange,提问作者GPaw
相关产品推荐
相关产品推荐

