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

已添加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中的配置迁移过去:

  1. 删除单独的services.AddControllers();调用,以及单独的services.AddMvc(...)调用;
  2. 用以下代码替换它们:
services.AddControllers(options =>
{
    var policy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build();
    options.Filters.Add(new AuthorizeFilter(policy));
}).AddFluentValidation(config => config.RegisterValidatorsFromAssemblyContaining<Create>());
  1. 额外检查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路由
    });
}
  1. 最后清理冗余代码:移除你在配置Identity后重复调用的services.AddAuthorization();(前面已经配置过授权策略,重复调用无意义)。

这样修改后,框架就能正确识别并加载控制器服务,启动时的异常应该就会消失了。

内容的提问来源于stack exchange,提问作者Breaks Coder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 11:08:12