.NET Core MVC中为指定文件夹控制器统一配置API默认路由
如何给.NET Core MVC中特定API文件夹下的控制器设置默认路由
嘿,这个需求我之前刚好处理过,完全不用逐个给控制器加[Route("api/[controller]")]特性,用.NET Core的应用模型约定就能自动给指定文件夹下的控制器添加默认路由,步骤很清晰:
1. 创建自定义路由约定类
我们需要实现IControllerModelConvention接口,在这个类里判断控制器是否属于目标API文件夹(通过命名空间匹配,一般项目里文件夹结构和命名空间是对应的),然后自动添加路由特性。
using Microsoft.AspNetCore.Mvc.ApplicationModels; public class ApiFolderRouteConvention : IControllerModelConvention { public void Apply(ControllerModel controller) { // 这里的判断逻辑可以根据你的实际命名空间调整 // 假设API文件夹下的控制器命名空间都包含 ".API.",比如 "YourProject.API.Controllers" if (controller.ControllerType.Namespace?.Contains(".API.") == true) { // 先检查控制器是否已经手动添加了Route特性,避免重复冲突 var hasExistingRoute = controller.Selectors.Any(selector => selector.AttributeRouteModel != null); if (!hasExistingRoute) { // 给符合条件的控制器添加默认路由 controller.Selectors.Add(new SelectorModel { AttributeRouteModel = new AttributeRouteModel( new RouteAttribute("api/[controller]") ) }); } } } }
2. 在服务配置中注册这个约定
根据你的.NET版本,在Program.cs(.NET 6+)或者Startup.cs(.NET 5及更早)里把自定义约定添加到MVC配置中:
.NET 6+ (Program.cs)
var builder = WebApplication.CreateBuilder(args); // 添加控制器服务并注册自定义约定 builder.Services.AddControllers(options => { options.Conventions.Add(new ApiFolderRouteConvention()); }); // 其他配置... var app = builder.Build(); // 中间件配置... app.MapControllers(); app.Run();
.NET 5及更早(Startup.cs)
public void ConfigureServices(IServiceCollection services) { services.AddControllers(options => { // 注册自定义路由约定 options.Conventions.Add(new ApiFolderRouteConvention()); }); } // 其他配置...
额外说明
- 命名空间匹配调整:如果你的API文件夹对应的命名空间不是包含
.API.,可以修改判断逻辑,比如用EndsWith(".API")或者精确匹配命名空间前缀。 - 自定义路由优先级:如果某个API控制器需要特殊路由,直接给它添加
[Route]特性即可——我们的代码里已经判断了如果控制器已有路由特性,就不会再添加默认路由,完全不影响自定义需求。 - 备选方案(基类继承):如果你更习惯用基类的方式,可以创建一个带
[Route("api/[controller]")]的ApiBaseController,然后让API文件夹下的所有控制器继承它。不过这种方法需要手动继承,不如约定方式自动化。
内容的提问来源于stack exchange,提问作者Anonymous Creator
相关产品推荐
相关产品推荐

