如何在.NET 6中实现REST API控制器的全局路由配置?
在.NET 6中实现无需[Route]属性的API全局路由配置
步骤1:调整控制器服务配置,移除属性路由强制要求
在Program.cs中添加控制器服务时,需要移除API控制器默认的属性路由强制约定,这样才能使用全局约定路由:
var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(options => { // 移除ApiController特性强制要求属性路由的约定 options.Conventions.Remove(typeof(ApiControllerAttributeRoutingConvention)); }); var app = builder.Build();
步骤2:配置全局约定路由
在中间件配置阶段,使用MapControllerRoute定义全局路由规则,不要调用MapControllers()(该方法专门处理属性路由,会与约定路由冲突):
app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "api_global", pattern: "{controller}", // 默认根据HTTP请求动词自动匹配对应方法名(如POST请求匹配Post方法) defaults: new { action = "{action}" } ); }); app.Run();
步骤3:编写无[Route]属性的API控制器
控制器可保留[ApiController]以使用API专属特性(如自动模型验证),但无需添加[Route]属性,方法名直接对应HTTP动作:
[ApiController] public class MyController : ControllerBase { // 匹配POST请求:POST /My public IActionResult Post() { return Ok("处理POST请求"); } // 匹配DELETE请求:DELETE /My public IActionResult Delete() { return Ok("处理DELETE请求"); } // 匹配GET请求:GET /My public IActionResult Get() { return Ok("处理GET请求"); } }
原代码失败原因
- 同时调用
MapControllerRoute和MapControllers():MapControllers()会强制要求控制器必须带有[Route]属性,触发启动报错。 [ApiController]特性默认包含ApiControllerAttributeRoutingConvention约定,该约定强制控制器使用属性路由,即使配置了全局约定路由也会报错,必须手动移除。
内容的提问来源于stack exchange,提问作者Mello1337
相关产品推荐
相关产品推荐

