要解决“Asp.net Core 2.1 HttpClientFactory: 第二个 API 调用不等待第一个 API 调用的返回结果”问题,可以使用异步编程和并发控制来确保第二个 API 调用等待第一个 API 调用的返回结果。
以下是一个示例代码,演示如何使用异步编程和并发控制来解决该问题:
using System;
using System.Net.Http;
using System.Threading.Tasks;
public class MyApiClient
{
private readonly HttpClient _httpClient;
public MyApiClient(HttpClient httpClient)
{
_httpClient = httpClient;
}
public async Task GetApi1DataAsync()
{
// 发起第一个 API 调用
HttpResponseMessage response = await _httpClient.GetAsync("http://api1.example.com");
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync();
}
public async Task GetApi2DataAsync()
{
// 发起第二个 API 调用
HttpResponseMessage response = await _httpClient.GetAsync("http://api2.example.com");
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync();
}
}
public class MyService
{
private readonly MyApiClient _apiClient;
public MyService(MyApiClient apiClient)
{
_apiClient = apiClient;
}
public async Task GetDataAsync()
{
// 调用第一个 API 并等待返回结果
string api1Data = await _apiClient.GetApi1DataAsync();
// 调用第二个 API 并等待返回结果
string api2Data = await _apiClient.GetApi2DataAsync();
return $"{api1Data} {api2Data}";
}
}
public class Program
{
public static async Task Main()
{
// 创建 HttpClient 实例
var httpClient = new HttpClient();
// 注册 HttpClient 实例到 HttpClientFactory
var httpClientFactory = new HttpClientFactory();
httpClientFactory.Register("apiClient", httpClient);
// 创建 MyApiClient 实例
var apiClient = new MyApiClient(httpClientFactory.CreateClient("apiClient"));
// 创建 MyService 实例
var myService = new MyService(apiClient);
// 调用 MyService 的 GetDataAsync 方法
string data = await myService.GetDataAsync();
Console.WriteLine(data);
}
}
在上面的示例代码中,通过使用异步编程和 await 关键字,确保了第二个 API 调用会等待第一个 API 调用的返回结果。同时,通过使用 HttpClientFactory 创建 HttpClient 实例,并将其注册到 HttpClientFactory,可以更好地管理 HttpClient 的生命周期。