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

ASP.NET Core 7中统一配置公共路由前缀api/module的方法咨询

ASP.NET Core 7.0 统一配置路由前缀的解决方案

针对你需要统一管理api/module路由前缀、方便添加/移除且不影响其他路由的需求,以下是几种可行方案:

方案1:全局路由约定(推荐)

通过自定义控制器路由约定,全局为所有API控制器添加统一前缀,无需修改每个控制器的路由属性。

步骤:

  1. 定义路由前缀约定类:
public class RoutePrefixConvention : IControllerModelConvention
{
    private readonly string _prefix;

    public RoutePrefixConvention(string prefix)
    {
        _prefix = prefix?.TrimEnd('/') ?? string.Empty;
    }

    public void Apply(ControllerModel controller)
    {
        foreach (var selector in controller.Selectors)
        {
            if (selector.AttributeRouteModel != null)
            {
                // 拼接现有路由与全局前缀
                var originalTemplate = selector.AttributeRouteModel.Template?.TrimStart('/') ?? string.Empty;
                selector.AttributeRouteModel.Template = string.IsNullOrEmpty(originalTemplate) 
                    ? _prefix 
                    : $"{_prefix}/{originalTemplate}";
            }
            else
            {
                // 控制器未定义路由时直接使用前缀
                selector.AttributeRouteModel = new AttributeRouteModel { Template = _prefix };
            }
        }
    }
}
  1. 在Program.cs中注册约定:
var builder = WebApplication.CreateBuilder(args);

// 读取前缀(可硬编码或从配置读取)
var apiPrefix = "api/module";

builder.Services.AddControllers(options =>
{
    // 添加全局路由前缀约定
    options.Conventions.Add(new RoutePrefixConvention(apiPrefix));
});

// ... 其他配置

var app = builder.Build();

// ... 中间件配置

app.MapControllers();

app.Run();
  1. 修改控制器路由:
    将原有控制器的[Route("api/module/myController")]改为[Route("myController")],前缀由约定自动添加:
[ApiController]
[Route("myController")]
public class MyControllerController : ControllerBase
{
    [HttpPost("create")]
    public IActionResult Create([FromBody] object model)
    {
        return Ok();
    }
}

移除前缀的方式:只需将Program.cs中的apiPrefix改为空字符串,或删除约定注册代码即可。

方案2:自定义路由属性

创建自定义路由属性,封装前缀逻辑,控制器通过该属性替代原生[Route],后续修改前缀只需更新自定义属性。

步骤:

  1. 定义自定义路由属性:
public class ModuleApiRouteAttribute : RouteAttribute
{
    // 统一维护前缀
    private const string _prefix = "api/module/";

    public ModuleApiRouteAttribute(string template) 
        : base($"{_prefix}{template.TrimStart('/')}")
    {
    }
}
  1. 控制器使用自定义属性:
[ApiController]
[ModuleApiRoute("myController")]
public class MyControllerController : ControllerBase
{
    [HttpPost("create")]
    public IActionResult Create([FromBody] object model)
    {
        return Ok();
    }
}

移除前缀的方式:将_prefix常量改为空字符串,所有使用该属性的控制器自动生效。

方案3:配置驱动的路由前缀

将前缀配置在appsettings.json中,通过约定动态读取,实现无需修改代码即可切换前缀。

步骤:

  1. 在appsettings.json中添加配置:
{
  "ApiSettings": {
    "RoutePrefix": "api/module"
  }
}
  1. 在Program.cs中读取配置并注册约定:
var builder = WebApplication.CreateBuilder(args);

// 从配置读取前缀,默认空字符串
var apiPrefix = builder.Configuration.GetValue<string>("ApiSettings:RoutePrefix") ?? string.Empty;

builder.Services.AddControllers(options =>
{
    if (!string.IsNullOrWhiteSpace(apiPrefix))
    {
        options.Conventions.Add(new RoutePrefixConvention(apiPrefix));
    }
});

// ... 其他配置与启动逻辑
  1. 控制器路由修改同方案1。

移除前缀的方式:将appsettings.json中的RoutePrefix设为空字符串,重启服务即可生效。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 16:45:02