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

.NET5升级.NET6后MapControllers方法执行报错原因咨询

问题根因

这个报错是Unity DI容器的特性和.NET 6 ASP.NET Core服务注册逻辑调整共同触发的,具体原因如下:

  1. services.AddControllers() 是纯API场景的服务注册方法,默认不会注册任何Razor、视图相关的服务,包括报错中提到的IRazorViewEngine。而services.AddControllersWithViews()会注册完整的MVC视图相关服务,自然包含了IRazorViewEngine的实现注册,所以替换后不会再触发构造异常。
  2. 官方默认的DI容器只会解析显式注册的服务,如果遇到未注册的类型会直接抛出「服务未找到」异常。但Unity容器默认开启了未注册类型自动构造的特性:如果遇到没有显式注册的类型,会尝试自己反射调用构造函数生成实例。刚好IRazorViewEngine的实现类没有公共构造函数,所以触发了InvalidRegistrationException异常。
  3. 你的项目中必然存在某段逻辑(可能是自研代码,也可能是第三方依赖包)尝试解析IRazorViewEngine实例,才会触发Unity的解析逻辑。常见的触发源包括带Razor依赖的Swagger扩展包、自定义的MVC过滤器/模型绑定器、误引用的视图相关Nuget包。
纯API项目的优化方案

如果不想额外注册视图相关服务,可以选择以下方案替换AddControllersWithViews()的临时解法:

  • 排查项目依赖:移除所有不需要的Razor相关Nuget包(比如Microsoft.AspNetCore.Mvc.Razor、Microsoft.AspNetCore.Mvc.ViewFeatures),如果使用了Swagger,检查是否用了依赖Razor的扩展包,替换为官方原生的Swashbuckle.AspNetCore包即可。
  • 调整Unity配置:关闭Unity的未注册类型自动构造特性,使其行为和官方DI保持一致。不同版本的Unity配置项略有差异,通常是在注册Unity容器时设置EnableAutoRegistration = false即可,这样Unity不会尝试自动构造未注册的IRazorViewEngine,只会抛出服务未找到的异常,更方便定位触发解析的代码位置。
  • 如果你找不到具体触发源,继续使用AddControllersWithViews()也不会有明显负面影响:纯API场景不会触发任何视图执行逻辑,多注册的服务只会占用极少量启动内存,不会影响运行时性能。
额外需要调整的配置
  • 检查Program.cs/Startup.cs中的中间件配置,移除UseRazorPages、UseStaticFiles(如果没有静态资源要托管)这类纯API不需要的中间件即可。
  • 检查项目文件(.csproj),确保没有启用Razor编译相关的冗余配置,SDK使用默认的Microsoft.NET.Sdk.Web即可。

内容的提问来源于stack exchange,提问作者Alexey Korsakov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 00:54:05