我正在尝试使用以下代码调用API。
static async Task<string> GetData(string url, string token)
{
string result = null;
ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;
using (var client = new HttpClient())
{
if (!string.IsNullOrWhiteSpace(token))
{
client.DefaultRequestHeaders.Clear();
client.DefaultRequestHeaders.Add("Authorization", "Bearer " + token);
}
try
{
HttpResponseMessage response = await client.GetAsync(url);
if (response.IsSuccessStatusCode)
{
result = await response.Content.ReadAsStringAsync();
}
}
catch (Exception ex)
{
return null;
}
return result;
}
}
调用这样的方法
var getData = GetData("<api-url>", token.access_token);
我得到Status = WaitingForActivation
有人可以帮助我在这里做错什么吗?我尝试找到解决方案,但没有asyn
方法也能得到结果,但是我找不到asyn
方法的任何解决方案。
任何帮助或建议将不胜感激。
预先感谢
答案 0 :(得分:0)
您需要await
这样的CallApi
方法:
var getData = await CallApi("<api-url>", token.access_token);
这意味着您的调用方法也必须像这样async
:
public static async Task MyCallingMethod(...)
{
...
var getData = await CallApi("<api-url>", token.access_token);
...
}
如果您的调用方法必须是同步的,请考虑按以下方式调用您的API:
public static void MyCallingMethod(...)
{
...
string getData = null;
Task.Run(async () =>
{
getData = await CallApi("<api-url>", token.access_token).ConfigureAwait(false);
}).GetAwaiter().GetResult();
...
}
此外,在HttpClient
语句中使用using
可能非常危险。请检查这篇文章:https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/
如果您注意到了,我在代码示例中使用了ConfigureAwait(false)
。您可以在以下文章中了解有关此内容的更多信息:https://blog.stephencleary.com/2012/07/dont-block-on-async-code.html