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

