如何将HttpClient与async/await一起正确使用

本文关键字:一起 await HttpClient async | 更新日期: 2023-09-27 18:00:06

以下代码出现两个错误:

public async Task<string> TestDownloadTask()
{
    HttpResponseMessage response = null;
    using (HttpClient client = new HttpClient())
    {
        client.BaseAddress = new Uri(@"https://api.nasa.gov/planetary/apod");
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        response.EnsureSuccessStatusCode();
        response = await client.GetStringAsync("?concept_tags=True&api_key=DEMO_KEY");
    }
    return response.Content;
}

我得到:

  • 无法等待"await"行上的"System.Threading.Tasks.Task"
  • 无法将表达式类型"System.Net.Http.Content"转换为返回类型"string"

我一直在尝试编写上面的代码,从web服务下载字符串,但关于如何使用async和wait以及如何使用HttpClient,似乎有很多相互矛盾的信息,我不知道我编写的代码出了什么问题。

我哪里出了问题?我应该怎么做?

如何将HttpClient与async/await一起正确使用

此方法client.GetStringAsync返回Task<string>

public Task<string> TestDownloadTask()
{
    using (HttpClient client = new HttpClient())
    {
        client.BaseAddress = new Uri(@"https://api.nasa.gov/planetary/apod");
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        // You don't need await here
        return client.GetStringAsync("?concept_tags=True&api_key=DEMO_KEY");
    }
}

使用以上功能:

public async void SomeMethod()
{
    // await to get string content
    string mystring = await TestDownloadTask();
}

更改为

return await client.GetStringAsync("?concept_tags=True&api_key=DEMO_KEY");

return await response.Content.ReadAsStringAsync();