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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:27:03