调用CreatedAtAction返回"No route matches the supplied values"错误如何解决?
问题根因
- 单元测试通过的原因是你直接实例化控制器调用方法,未触发ASP.NET Core路由解析、Action查找逻辑,仅校验了返回值类型,不会验证路由是否真实存在。
- 核心错误点是你定义的
FindById方法为private访问修饰符,ASP.NET Core 路由系统只会将public修饰的控制器方法识别为可路由的Action,private方法不会被注册到全局路由表中。因此当CreatedAtAction尝试生成响应的Location头时,找不到匹配的FindById路由,就抛出了No route matches the supplied values异常。 - 你之前尝试的
SuppressAsyncSuffixInActionNames配置是用于处理Action名带Async后缀时路由系统自动裁剪后缀的场景,和当前问题无关,因此不生效。
修复方案
将FindById方法的访问修饰符从private修改为public即可:
[HttpGet("{id}", Name ="FindById")] public async Task<ActionResult<LicenseType>> FindById(Guid id ) { var licenseType = await _context.LicenseTypes.FirstOrDefaultAsync(e => e.LicenseTypeId == id); if (licenseType == null) { return NotFound(); } return licenseType; }
可选优化
如果你不希望将FindById接口暴露给外部调用,可以改用CreatedAtRoute方法生成返回值,不需要依赖Action名称,直接使用你在HttpGet特性中声明的路由Name即可:
// AddAsync方法中修改返回语句 return CreatedAtRoute("FindById", new { id = newLicenseType.LicenseTypeId }, newLicenseType);
内容的提问来源于stack exchange,提问作者s_om
相关产品推荐
相关产品推荐

