.NET Core控制台C#环境下多级依赖API高效调用方案问询
.NET Core 接口请求最优实现方案
核心优化逻辑
API1、API2为强依赖的串行步骤,必须按顺序执行;后续API3、API4不存在依赖关系,可通过异步并行+去重的方式大幅提升执行效率,和串行循环调用相比,整体耗时可从O(n)级(n为车辆数量)降到接近固定耗时,同时减少无效请求。
具体实现步骤
1. 串行执行前置依赖请求
- 异步调用API1获取DataID,使用
await保证拿到结果后再执行后续流程 - 传入DataID异步调用API2获取
vehicleIds数组,提前对数组做去重处理,避免后续重复请求相同车辆数据
2. 并行批量调用API3获取车辆详情
使用Task.WhenAll发起所有车辆详情的异步请求,无需逐个等待返回,参考代码:
// 已提前定义好VehicleDetail实体类匹配返回字段,dataId、vehicleIds为前置步骤拿到的结果 var vehicleDetailTasks = vehicleIds.Select(vehicleId => httpClient.GetFromJsonAsync<VehicleDetail>($"../api/{dataId}/vehicles/{vehicleId}") ); // 等待所有车辆详情请求完成 var vehicleDetails = (await Task.WhenAll(vehicleDetailTasks)).ToList();
3. 去重后并行调用API4获取经销商信息
先从车辆详情中提取所有dealerId并去重,避免同一个经销商重复发起请求,再批量调用API4:
// 已提前定义好DealerInfo实体类匹配返回字段 var distinctDealerIds = vehicleDetails.Select(v => v.DealerId).Distinct().ToList(); var dealerTasks = distinctDealerIds.Select(dealerId => httpClient.GetFromJsonAsync<DealerInfo>($"../api/{dataId}/dealers/{dealerId}") ); // 把返回结果转成字典方便后续匹配 var dealerDict = (await Task.WhenAll(dealerTasks)).ToDictionary(d => d.DealerId, d => d.Name);
4. 结果拼装
遍历车辆详情列表,从dealerDict中匹配对应经销商名称即可得到最终需要的完整数据。
额外优化建议
- 若
vehicleIds数量较大(超过接口限流阈值),可使用SemaphoreSlim控制并发数,避免触发接口限流,参考代码:
// 限制最多同时发起10个请求,可根据接口限流规则调整数值 using var semaphore = new SemaphoreSlim(10); var vehicleDetailTasks = vehicleIds.Select(async vehicleId => { await semaphore.WaitAsync(); try { return await httpClient.GetFromJsonAsync<VehicleDetail>($"../api/{dataId}/vehicles/{vehicleId}"); } finally { semaphore.Release(); } }); var vehicleDetails = (await Task.WhenAll(vehicleDetailTasks)).ToList();
- 可搭配Polly库配置重试、熔断策略,处理偶发的接口请求失败问题,提升流程稳定性
- 全程使用异步方法,不要用
.Result、.Wait()等同步阻塞方法,避免线程阻塞和死锁风险
内容的提问来源于stack exchange,提问作者software developer
相关产品推荐
相关产品推荐

