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自带的后台管理页面无法打开,返回异常:
修复方案
问题核心原因有两个:
- ASP.NET Core默认的控制器扫描逻辑,只会加载入口程序集、直接引用且带有启动配置的程序集的控制器,Reusable API作为被Module引用的类库,不在Orchard CMS的默认扫描范围内,所以找不到对应控制器
- 直接在CMS主站提前注册
MapControllers会打乱Orchard Core自身的路由优先级约定,导致后台管理路由被覆盖,无法正常访问
按以下步骤修改即可解决:
- 恢复CMS主站的默认Startup配置,删掉之前额外添加的
services.AddControllers()和app.UseEndpoints()代码,保持Orchard推荐的初始化逻辑即可,不要在主站管道里自行注册控制器路由。 - 删除Reusable API项目中的Startup.cs,这个项目是类库,不会作为独立宿主运行,里面的启动代码永远不会被执行,属于无效代码。
- 删除Module项目Configure方法中自行编写的
app.UseEndpoints()代码,Orchard Core会统一接管所有路由注册,模块自行注册端点会和全局路由规则产生冲突。 - 在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
相关产品推荐
相关产品推荐

