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

Orchard CMS引用类库API控制器404 配置后后台无法访问

问题背景

我创建了三个Web项目:

  • Orchard CMS 主站项目
  • Module 功能模块项目
  • Reusable API 可复用API类库项目

Module项目引用Reusable API,独立运行时所有功能正常。将Module集成到CMS中启用后,出现异常:CMS无法定位Reusable API中定义的控制器,调用对应接口返回404。

问题截图


现有代码配置

CMS项目 Startup.cs

public class Startup
{
    // 运行时自动调用,用于向容器注册服务
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddOrchardCms();
    }

    // 运行时自动调用,用于配置HTTP请求管道
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
      
        app.UseRouting();
        app.UseOrchardCore();
    }
}

Module项目 Startup.cs

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseRouting();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
    }
}

Reusable API项目 Startup.cs

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseRouting();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
    }
}

ReusableAPI 测试控制器

[Route("api/[controller]")]
[ApiController]
[IgnoreAntiforgeryToken]
public class TestController:ControllerBase
{
    [HttpGet]
    public ActionResult Test()
    {
        return Ok("test");
    }
}

问题现象
  • 独立运行Module项目时,/api/Test接口可以正常返回结果
  • 运行CMS项目调用该接口直接返回404 Not Found

临时尝试方案

曾尝试在CMS的Startup.cs中直接添加全局控制器配置,修改后代码如下:

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers();
        services.AddOrchardCms();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseRouting();
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
        app.UseOrchardCore();
    }
}

修改后Reusable API的接口可以正常访问:
接口正常访问截图

但出现新问题:CMS自带的后台管理页面无法打开,返回异常:
后台无法访问截图


修复方案

问题核心原因有两个:

  1. ASP.NET Core默认的控制器扫描逻辑,只会加载入口程序集、直接引用且带有启动配置的程序集的控制器,Reusable API作为被Module引用的类库,不在Orchard CMS的默认扫描范围内,所以找不到对应控制器
  2. 直接在CMS主站提前注册MapControllers会打乱Orchard Core自身的路由优先级约定,导致后台管理路由被覆盖,无法正常访问

按以下步骤修改即可解决:

  1. 恢复CMS主站的默认Startup配置,删掉之前额外添加的services.AddControllers()和app.UseEndpoints()代码,保持Orchard推荐的初始化逻辑即可,不要在主站管道里自行注册控制器路由。
  2. 删除Reusable API项目中的Startup.cs,这个项目是类库,不会作为独立宿主运行,里面的启动代码永远不会被执行,属于无效代码。
  3. 删除Module项目Configure方法中自行编写的app.UseEndpoints()代码,Orchard Core会统一接管所有路由注册,模块自行注册端点会和全局路由规则产生冲突。
  4. 在Module项目的ConfigureServices方法中,手动将Reusable API的程序集注册到MVC应用部件中,告诉Orchard需要扫描加载这个类库里的控制器,修改后代码如下:
public void ConfigureServices(IServiceCollection services)
{
    // 注册控制器,并加载Reusable API程序集的控制器
    services.AddControllers()
        .AddApplicationPart(typeof(TestController).Assembly)
        .AddControllersAsServices();
}

这里的typeof(TestController)可以替换为Reusable API项目中任意一个公开的控制器、服务类型,用来定位对应程序集即可。

修改完成后重新编译启动,既可以正常访问Reusable API中的所有接口,CMS后台管理页面也能正常加载,不会出现路由冲突。


内容的提问来源于stack exchange,提问作者The One

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.11 16:16:22