ASP.NET Core 7中统一配置公共路由前缀api/module的方法咨询
ASP.NET Core 7.0 统一配置路由前缀的解决方案
针对你需要统一管理api/module路由前缀、方便添加/移除且不影响其他路由的需求,以下是几种可行方案:
方案1:全局路由约定(推荐)
通过自定义控制器路由约定,全局为所有API控制器添加统一前缀,无需修改每个控制器的路由属性。
步骤:
- 定义路由前缀约定类:
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 }; } } } }
- 在
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();
- 修改控制器路由:
将原有控制器的[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],后续修改前缀只需更新自定义属性。
步骤:
- 定义自定义路由属性:
public class ModuleApiRouteAttribute : RouteAttribute { // 统一维护前缀 private const string _prefix = "api/module/"; public ModuleApiRouteAttribute(string template) : base($"{_prefix}{template.TrimStart('/')}") { } }
- 控制器使用自定义属性:
[ApiController] [ModuleApiRoute("myController")] public class MyControllerController : ControllerBase { [HttpPost("create")] public IActionResult Create([FromBody] object model) { return Ok(); } }
移除前缀的方式:将_prefix常量改为空字符串,所有使用该属性的控制器自动生效。
方案3:配置驱动的路由前缀
将前缀配置在appsettings.json中,通过约定动态读取,实现无需修改代码即可切换前缀。
步骤:
- 在
appsettings.json中添加配置:
{ "ApiSettings": { "RoutePrefix": "api/module" } }
- 在
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。
移除前缀的方式:将appsettings.json中的RoutePrefix设为空字符串,重启服务即可生效。
内容的提问来源于stack exchange,提问作者Seba
相关产品推荐
相关产品推荐

