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

ASP.NET Core2.1升2.2报错无法实例化ActionDescriptorCollectionProvider

问题根因

两个报错本质都是ASP.NET Core 2.1到2.2版本内部实现变更、迁移步骤遗漏导致的:

  1. 手动注册IActionDescriptorCollectionProvider抛实例化错误的原因:2.2版本中ActionDescriptorCollectionProvider类的访问修饰符从2.1的public改为了internal,依赖注入容器无法反射创建内部访问级别的类型实例,自然抛出ArgumentException。且该服务在2.2中会由MVC框架自动注册,完全不需要手动添加。
  2. 注释掉该行后启动崩溃无明确报错的原因:大概率没有完成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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 05:18:25