已添加AddControllers仍报System.InvalidOperationException错误的排查与解决
问题分析与解决方案
首先,咱们来定位问题的核心:你在ConfigureServices里同时调用了services.AddControllers()和services.AddMvc(...),这两个方法在ASP.NET Core中存在功能重叠,且AddMvc的注册逻辑会干扰AddControllers添加的服务,最终导致MapControllers无法找到所需的控制器服务。
为什么会出现这个矛盾?
在ASP.NET Core的服务注册逻辑里:
AddControllers()是专门为API项目设计的,仅注册控制器相关的核心服务;AddMvc()则是针对完整MVC(包含视图引擎)的注册,它内部已经包含了AddControllers()的所有功能,但会额外添加视图渲染相关的服务。
当你同时调用这两个方法时,AddMvc的后续注册会覆盖或重置部分AddControllers添加的服务配置,导致框架在启动校验时无法识别正确的控制器服务,从而抛出那个"找不到所需服务"的错误。
具体解决步骤
你需要合并这两个注册逻辑,只保留适配API场景的AddControllers(),并把原本在AddMvc中的配置迁移过去:
- 删除单独的
services.AddControllers();调用,以及单独的services.AddMvc(...)调用; - 用以下代码替换它们:
services.AddControllers(options => { var policy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build(); options.Filters.Add(new AuthorizeFilter(policy)); }).AddFluentValidation(config => config.RegisterValidatorsFromAssemblyContaining<Create>());
- 额外检查
Configure方法的中间件顺序(这也是API启动常见的坑),必须遵循以下规范顺序:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // 先加载异常处理、静态文件等基础中间件 if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseRouting(); // 跨域中间件要放在认证授权之前 app.UseCors("CorsAllowAll"); app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); endpoints.MapHub<ChatHub>("/chat"); // 保留你的SignalR路由 }); }
- 最后清理冗余代码:移除你在配置Identity后重复调用的
services.AddAuthorization();(前面已经配置过授权策略,重复调用无意义)。
这样修改后,框架就能正确识别并加载控制器服务,启动时的异常应该就会消失了。
内容的提问来源于stack exchange,提问作者Breaks Coder
相关产品推荐
相关产品推荐

