.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
相关产品推荐
相关产品推荐

