状态=使用Async方法的WaitingForActivation

时间:2019-08-23 05:48:57

标签: c# rest api oauth-2.0 async-await

我正在尝试使用以下代码调用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方法的任何解决方案。

任何帮助或建议将不胜感激。

预先感谢

1 个答案:

答案 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