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

Net Core 3 Web API属性路由下如何正确配置CreatedAtRoute返回201状态码

解决方案

首先你需要先给目标接口(OperationsController的GetOperationsById)的路由属性显式指定Name参数,RouteName是全局唯一标识,是CreatedAtRoute匹配路由的核心依据。

步骤1:给目标Action设置RouteName

修改OperationsController中GetOperationsById的路由属性,添加Name配置,推荐用nameof语法避免硬编码错误:

[ApiController]
public class OperationsController : ControllerBase
{
    [HttpGet]
    // 新增Name参数,值为方法名即可
    [Route("contractsOperation/{id}", Name = nameof(GetOperationsById))]
    public async Task<IActionResult> GetOperationsById(int id)
    {
        var operation = _service.GetOperation(id);
        return Ok(operation);
    }
}

步骤2:在Post方法中填写对应的RouteName

直接在CreatedAtRoute第一个参数传入刚才定义的RouteName即可,同时注意路由参数名要和目标接口的路由参数名保持一致(这里目标接口的参数是id,所以要显式指定参数名id):

[ApiController]
public class ContractsController : ControllerBase
{
    [HttpPost]
    [Route("saveContract")]
    public async Task<IActionResult> CreatedContract(string jsonData)
    {
        var newlyCreatedContract = _service.Create(jsonData);

        // 直接传入刚才定义的RouteName,用nameof写法可以在编译期检查拼写错误
        var route = nameof(OperationsController.GetOperationsById);
        // 注意匿名类的属性名要和目标路由的参数名id对应,避免路由匹配失败
        return CreatedAtRoute(route, new { id = newlyCreatedContract.Id }, newlyCreatedContract);
    }
}

补充说明

  • RouteName是全局唯一的,不用额外指定控制器名称,只要保证所有Action的RouteName不重复即可正常匹配
  • 如果你不想用nameof语法,也可以直接传入字符串"GetOperationsById",但拼写错误不会在编译期暴露,更推荐用nameof的写法
  • 一定要保证路由参数的名称和类型和目标接口的路由参数一致,否则会生成错误的Location响应头

内容的提问来源于stack exchange,提问作者Serhio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 12:18:04