Введение
Я работал в ASP.NET Web API, где столкнулся с некоторыми странными взаимодействиями при попытке вызвать другой API.Я попробовал 3 разных способа использования HttpClient, все с разными результатами.
Протестировал все, используя Postman, отсюда и некоторые результаты.
1.Синхронизация вызова HttpClient
private static string GetAPI(string url)
{
using (HttpClient client = new HttpClient())
{
client.BaseAddress = new Uri(url);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Add("x-api-key", "SomeSecretApiKey");
HttpResponseMessage response = client.GetAsync(url).Result;
string contents = response.Content.ReadAsStringAsync().Result;
if (response.IsSuccessStatusCode)
{
return contents;
}
}
return null;
}
Результат
Работает , но я хочу использовать async
2.Асинхронный вызов httpClient
private static async Task<string> GetAPI(string url)
{
using (HttpClient client = new HttpClient())
{
client.BaseAddress = new Uri(url);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Add("x-api-key", "SomeSecretApiKey");
HttpResponseMessage response = await client.GetAsync(url);
string contents = await response.Content.ReadAsStringAsync();
if (response.IsSuccessStatusCode)
{
return contents;
}
}
return null;
}
Результат
Не работает .Не выйдет за черту HttpResponseMessage response = await client.GetAsync(url);
, так как ответа никогда не будет?
3.Асинхронный вызов httpClient с общим HttpClient
private static readonly HttpClient client = new HttpClient();
private static async Task<string> GetAPI(string url)
{
client.BaseAddress = new Uri(url);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Add("x-api-key", "SomeSecretApiKey");
HttpResponseMessage response = await client.GetAsync(url);
string contents = await response.Content.ReadAsStringAsync();
if (response.IsSuccessStatusCode)
{
return contents;
}
return null;
}
Результат
Работает один раз .Затем выдаст ошибку: System.AggregateException: One or more errors occurred. ---> System.InvalidOperationException: This instance has already started one or more requests. Properties can only be modified before sending the first request.
(как предполагает этот SO-ответ ).
Вопрос
Я был бы признателен, если бы кто-то мог объяснить, почему эти результаты такдругой и / или дать альтернативный способ совершить базовый вызов HttpClient
(все равно хотелось бы использовать async
).