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

.NET Core API调用CreateAtRoute时出现No route matches the supplied values错误的问题排查求助

解决CreatedAtRoute抛出"No route matches the supplied values"异常的问题

我来帮你分析下这个问题的可能原因和解决方案:

最常见的原因:路由名称未显式指定

ASP.NET Core中,CreatedAtRoute是通过路由名称来匹配目标action的,而默认情况下,[HttpGet]特性并不会自动将action名称作为路由名称(尤其是在使用了路由前缀的场景下)。虽然你用了nameof(GetCommandById)来指定路由名称,但如果目标action没有显式绑定这个名称,框架可能无法正确识别对应的路由。

解决方案:给GetCommandById显式添加路由名称

修改你的GetCommandById方法的特性,加上Name参数明确绑定路由名称:

[HttpGet("{id}", Name = nameof(GetCommandById))]
public ActionResult<CommandReadDto> GetCommandById(int id)
{
    var command = _repository.GetCommandById(id);
    if(command != null) { 
        return Ok(_mapper.Map<CommandReadDto>(command)); 
    }
    return NotFound();
}

这样框架就能明确将这个路由和GetCommandById的名称绑定,CreatedAtRoute就能准确找到对应的路由规则了。

其他需要排查的点

  • 确认commandReadDto.Id的有效性:虽然你在SaveChanges()之后映射Dto,但要确保数据库的自增Id已经被正确赋值给commandModel.Id——如果commandReadDto.Id是0或者无效值,会导致路由参数不匹配。你可以在return CreatedAtRoute之前加个断点,检查这个值是否正确。
  • 检查路由参数的名称匹配:你的GetCommandById参数是int id,CreatedAtRoute传入的是new { id = commandReadDto.Id },参数名称完全一致,这部分是没问题的;但如果参数名称不匹配(比如Dto里是CommandId却传成new { CommandId = ... })就会出错,你的代码里这部分是正确的。
  • 确认控制器的路由前缀是否生效:你的控制器上有[Route("api/commands")],GetCommandById的完整路由是api/commands/{id},CreatedAtRoute会自动结合控制器前缀生成正确的URL,这部分也没问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 20:17:46