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

如何在.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 23:35:42