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

如何在ASP.NET API中为所有控制器路由统一添加前缀?

ASP.NET 6.0 API 全局添加路由前缀的集中式配置方案

下面提供两种无需逐个修改控制器的高效方案,解决全局添加/appapi/前缀的需求:

方案一:使用路由组(MapGroup)

这是ASP.NET 6推荐的简洁方式,适配大多数属性路由或常规路由场景。

在Program.cs中配置路由时,将所有控制器端点纳入指定前缀的路由组:

app.UseRouting();

// 针对使用属性路由的控制器
app.MapGroup("/appapi").MapControllers();

// 针对使用常规路由的控制器(如未加[Route]属性的控制器)
app.MapGroup("/appapi").MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

说明:

  • 原本带有[Route("[controller]")]的控制器,最终路由会自动拼接为/appapi/[controller]/...
  • 无需修改任何控制器的[Route]属性,配置后全局生效

方案二:自定义路由约定(IControllerModelConvention)

如果需要更灵活的全局路由规则(比如兼容既有路由模板、处理特殊控制器例外),可以通过自定义约定实现。

1. 创建全局路由前缀约定类

public class GlobalRoutePrefixConvention : IControllerModelConvention
{
    private readonly string _prefix;

    public GlobalRoutePrefixConvention(string prefix)
    {
        _prefix = prefix.StartsWith("/") ? prefix : $"/{prefix}";
    }

    public void Apply(ControllerModel controller)
    {
        // 遍历控制器已有的路由模板,添加前缀
        foreach (var selector in controller.Selectors)
        {
            if (selector.AttributeRouteModel?.Template != null)
            {
                selector.AttributeRouteModel.Template = string.Concat(_prefix, "/", selector.AttributeRouteModel.Template);
            }
        }

        // 若控制器无路由属性,添加默认前缀+控制器名称的路由
        if (!controller.Selectors.Any(s => s.AttributeRouteModel != null))
        {
            controller.Selectors.Add(new SelectorModel
            {
                AttributeRouteModel = new AttributeRouteModel
                {
                    Template = $"{_prefix}/{controller.ControllerName}"
                }
            });
        }
    }
}

2. 在Program.cs中注册约定

builder.Services.AddControllers(options =>
{
    // 注册全局路由前缀约定
    options.Conventions.Add(new GlobalRoutePrefixConvention("appapi"));
});

说明:

  • 自动为所有控制器(无论是否已有[Route]属性)的路由模板添加前缀
  • 可扩展逻辑,比如添加判断条件跳过特定控制器

关于UsePathBase无效的说明

你之前尝试的app.UsePathBase("/appapi")并非用于修改路由前缀,而是设置应用的基础路径——相当于将应用部署在/appapi路径下,请求时的/appapi会被剥离后再匹配路由模板。例如请求https://yourdomain/appapi/MyController,应用实际处理的是/MyController,因此路由模板中不会显示/appapi,这和你想要的“所有API端点带前缀”的需求不符,所以达不到预期效果。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 12:20:19