【问题标题】:HttpResponseMessage' does not contain a definition for 'GetAwaiter' and no accessible extension method 'GetAwaiter'HttpResponseMessage' 不包含 'GetAwaiter' 的定义,并且没有可访问的扩展方法 'GetAwaiter'
【发布时间】:2020-10-06 17:29:43
【问题描述】:

我在 C# 中有这个 xUnit 方法来测试一个 web api

    [Fact]
    public async Task GetWeatherForecast()
    {
        var apiClient = new HttpClient();

        var apiResponse = await apiClient.GetAsync($"http://xxx/weatherforecast").Result;

        Assert.True(apiResponse.IsSuccessStatusCode);
    }

但是遇到了这个错误HttpResponseMessage' does not contain a definition for 'GetAwaiter' and no accessible extension method 'GetAwaiter'。如果我删除async Taskawait,它可以成功运行。

【问题讨论】:

标签: c# async-await


【解决方案1】:

不要致电Result,在使用 async 和 await 模式时可能会导致问题

 var apiResponse = await apiClient.GetAsync($"http://xxx/weatherforecast");

但是,问题在于您正在尝试使用与await 关键字相关联的语言功能,该关键字需要awaitable。编译器规定await 必须满足某些约束。 awaitable 必须实现GetAwaiter 方法、INotifyCompletionIsCompletedGetResult 方法。这就是错误消息所描述的内容。

这是因为您调用了 Result<T> 方法,该方法返回 task 的结果值(在这种情况下,从 GetAsync<Task<T>> 返回的 Task 的结果,您的 @987654331 @)。然后你试图await 它就像它是一个任务 / awaitable,它不是。

一般来说,在现代很少有调用ResultWait实际上是个好主意的情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    • 2017-04-20
    • 2017-11-20
    • 2018-08-21
    • 2023-01-19
    相关资源
    最近更新 更多