ASP.NET Core如何设置LocationUri指向另一个Controller的Action方法
ASP.NET Core WebAPI 跨Controller生成Location响应头的规范实现
ASP.NET Core 内置了专用的辅助方法,不需要手动拼接路径,框架会自动根据路由配置生成正确的Location地址,后续修改路由规则也不需要调整对应逻辑,有两种常用实现方案:
方案1:使用 CreatedAtAction 方法(推荐,不需要额外配置路由名)
直接指定目标Action所属的Controller名称、Action名称和路由参数即可,框架会自动匹配路由生成地址:
调整 AuthorisationController 的 Put 方法代码:
[Route("{id}")] public IActionResult Put([FromRoute]string id, [FromBody]FooBar request) { var sanitisedResponse = SanitiseResponse(request); // 参数说明: // 1. actionName:目标Action的方法名,用nameof获取避免硬编码拼写错误 // 2. controllerName:目标Controller的名称(不需要带Controller后缀) // 3. routeValues:目标Action需要的路由参数,这里替换成你实际要传递的事务ID即可 // 4. value:返回的响应体内容 return CreatedAtAction( actionName: nameof(TransactionController.Get), controllerName: "Transaction", routeValues: new { id = "需要指向的Transaction记录ID" }, value: sanitisedResponse); }
方案2:使用 CreatedAtRoute 方法(需要给目标路由设置名称)
如果希望通过路由名定位目标地址,可以给TransactionController的Get方法设置路由名:
第一步:给TransactionController的Get方法添加路由名
[Route("{id}", Name = "GetTransaction")] // 新增Name属性指定路由名 public IActionResult Get([FromRoute] string id) { return new OkResult(); }
第二步:调整AuthorisationController的Put方法代码
[Route("{id}")] public IActionResult Put([FromRoute]string id, [FromBody]FooBar request) { var sanitisedResponse = SanitiseResponse(request); return CreatedAtRoute( routeName: "GetTransaction", routeValues: new { id = "需要指向的Transaction记录ID" }, value: sanitisedResponse); }
两种方案的优势
- 无需手动拼接路径,完全由框架根据路由配置生成,不会出现斜杠、路由前缀拼写错误的问题
- 后续修改Controller路由前缀、Action路由模板时,不需要调整生成Location的逻辑,框架会自动适配
- 自动处理应用部署路径问题:如果应用部署在站点子路径下,内置方法会自动补全根路径,不会出现地址找不到的问题
内容的提问来源于stack exchange,提问作者Dr Schizo
相关产品推荐
相关产品推荐

