如何在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
相关产品推荐
相关产品推荐

