ASP.NET Core中如何在POST方法内调用GET路由获取返回结果
ASP.NET Core 控制器内调用其他接口不中断后续逻辑的实现方案
问题描述
开发ASP.NET Core Web API时,需要在POST路由方法内部调用名为Profile的GET接口,该GET接口定义如下:
[HttpGet(Name = "Profile")] public async Task<ActionResult<ProfileResponseDto>> GetProfile(string username)
最初使用RedirectToRoute实现调用:
return RedirectToRoute("Profile", new { username = profile.UserName });
这种写法会直接返回GET接口的响应,终止POST方法后续逻辑执行,不符合需求。
预期效果是获取GET方法的返回结果后,仍可在当前POST方法中执行后续处理,和Python中发送HTTP请求拿到响应后再继续处理的逻辑一致:
amount = requests.get("http://"+catalogIpAddress+":"+port+"/count/" + str(id))
实现方法
根据场景二选一即可:
- 同控制器下直接调用方法(优先推荐)
如果GET方法和当前POST方法在同一个控制器类中,完全不需要走HTTP重定向或者发HTTP请求,直接像调用普通C#异步方法一样调用即可,拿到返回值后可以自由执行后续逻辑,不会中断流程。
参考代码:// 直接调用同控制器的GET方法,传入用户名参数 var profileResponse = await GetProfile(profile.UserName); // 先校验返回结果,处理GET接口报错的场景 if (profileResponse.Value == null) { // 这里写GetProfile调用失败的处理逻辑,比如返回对应错误码 return BadRequest("获取用户信息失败"); } // 拿到实际的返回DTO ProfileResponseDto profileData = profileResponse.Value; // 后续写POST方法需要执行的剩余逻辑即可,直接使用profileData - 跨控制器/需走完整HTTP请求流程的场景
如果GET方法在其他控制器,或者你需要让调用经过完整的中间件、过滤器、模型绑定等HTTP管道流程,可以用IHttpClientFactory发送本地HTTP请求获取结果,和Python里requests.get的逻辑完全一致。
参考代码:- 先在控制器构造函数注入
IHttpClientFactory
private readonly IHttpClientFactory _httpClientFactory; public UserController(IHttpClientFactory httpClientFactory) { _httpClientFactory = httpClientFactory; }- 在POST方法中发送请求拿结果
var client = _httpClientFactory.CreateClient(); // 用UrlHelper根据路由名生成完整请求地址,避免硬编码 var requestUri = Url.RouteUrl("Profile", new { username = profile.UserName }, Request.Scheme); // 发GET请求并反序列化为对应的DTO类型 var profileData = await client.GetFromJsonAsync<ProfileResponseDto>(requestUri); // 拿到profileData后即可继续执行POST的后续逻辑 - 先在控制器构造函数注入
注意:非必要不要在同项目内用HTTP请求调用自身接口,直接方法调用的性能更高、调试更方便,也不用额外处理HTTP请求的异常问题。
内容的提问来源于stack exchange,提问作者Rawan
相关产品推荐
相关产品推荐

