我一直在 ASP.NET Web API 中工作,在尝试调用另一个 API 时遇到了一些奇怪的交互。我尝试了 3 种不同的方法来使用 HttpClient,但都有不同的结果。
已使用 Postman 测试了所有内容,因此得到了一些结果。
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
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);
,因为从来没有回应?
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:发生一个或多个错误。 ---> System.InvalidOperationException:此实例已启动一个或多个请求。属性只能在发送第一个请求之前修改。
(按照这个SO答案的建议)。
如果有人可以解释为什么这些结果如此不同和/或提供另一种方法来进行基本的
HttpClient
调用(仍然想使用 async
),我将不胜感激。
@Igor 已告知我第二个示例中的死锁问题。
所以我目前使用的是
HttpClient
(async
):
private static async Task<string> GetAPI(string url)
{
// TODO: Use a shared instance of HttpClient
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");
var jsonString = await client.GetStringAsync(url).ConfigureAwait(false);
return jsonString;
}
}
虽然有些事情已经弄清楚,但整个问题尚未得到解答。我因此不会接受这个答案,但要感谢那些为我提供有关使用
HttpClient
的良好信息的人。