.NET 7中如何修改继承BaseApiController的控制器路由名称?
解决方案
方法1:使用[ControllerName]特性(最简单直接)
在派生控制器上添加[ControllerName]特性,指定你想要的路由名称即可。基类的[Route("api/v1/[controller]")]会自动用这个指定值替换[controller]占位符,完美兼容原有的动作路由模板。
示例代码:
// 抽象基类 [Route("api/v1/[controller]")] public abstract class BaseApiController<TController> : ControllerBase { } // 派生的Auth控制器 [ControllerName("auth")] public class AuthApiController : BaseApiController<AuthApiController> { [HttpPost("new")] public IActionResult CreateNewUser() { // 业务逻辑代码 return Ok(); } }
此时CreateNewUser方法的路由会自动变为/api/v1/auth/new。
方法2:在派生控制器上直接指定路由前缀
如果不想依赖[controller]占位符,也可以在派生控制器类上重新定义[Route]特性,直接写死自定义前缀,覆盖基类的类级路由规则:
[Route("api/v1/auth")] public class AuthApiController : BaseApiController<AuthApiController> { [HttpPost("new")] public IActionResult CreateNewUser() { return Ok(); } }
这种方式更灵活,适合需要完全自定义路由前缀的场景,动作方法的路由模板会自动和这个前缀拼接。
方法3:自定义控制器路由约定(批量处理)
如果项目中有大量XXXApiController格式的控制器,想要统一去掉Api后缀生成路由,可以自定义全局约定批量处理:
- 创建约定实现类:
public class TrimApiControllerSuffixConvention : IControllerModelConvention { public void Apply(ControllerModel controller) { // 针对以"ApiController"结尾的控制器名称,去掉后缀 if (controller.ControllerName.EndsWith("ApiController")) { controller.ControllerName = controller.ControllerName.Replace("ApiController", string.Empty); } } }
- 在
Program.cs中注册该约定:
builder.Services.AddControllersWithViews(options => { options.Conventions.Add(new TrimApiControllerSuffixConvention()); });
注册后,所有类似AuthApiController的控制器,其[controller]占位符都会自动替换为auth,基类的路由规则会直接生成api/v1/auth前缀,无需逐个控制器配置。
内容的提问来源于stack exchange,提问作者Matteo Pietro Peru
相关产品推荐
相关产品推荐

