【问题标题】:Asynchronous API call failing异步 API 调用失败
【发布时间】:2016-03-08 01:29:14
【问题描述】:

我有两种方法可以进行 API 调用。第一个,巧妙地命名为 apiCall,完全按预期工作。我传递了一个字符串 url 和要发布的对象,进行了调用,我收到了一个 HttpResponseMessage 类对象:

    public HttpResponseMessage apiCall(string url, object o)
    {
        using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri(baseUrl);
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            HttpResponseMessage response = client.PostAsJsonAsync(url, o).Result;

            if (response.IsSuccessStatusCode)
            {
                return response;
            }
            else
            {
                throw new Exception(response.ReasonPhrase);
            }
        }
    }

但是,我也有一个用于进行异步调用的方法。它最初被命名为 asyncApiCall,并且是这样构造的:

public void asyncApiCall(string url, object o)
    {
        using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri(baseUrl);
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            client.PostAsJsonAsync(url, o);
        }
    }

如您所见,这是相同的方法,但减去了实际从服务器返回响应的代码。但是,服务器没有收到任何类型的消息。

总结:我的同步调用正常,我的异步调用失败。我想我做错了什么,但我能找到的所有文档都暗示 HttpClient 的 PostAsJsonAsync 方法默认是异步的。从逻辑上讲,我预计(并且已经看到很多人遇到)相反的问题。

【问题讨论】:

  • 您需要将await 添加到您的client.PostAsJsonAsync() 呼叫中。正如你所拥有的那样,我想HttpClient 在你的PostAsJsonAsync() 完成之前被处置。

标签: c# asp.net asp.net-web-api2


【解决方案1】:

这需要等待:

await client.PostAsJsonAsync(url, o);

这意味着这需要async

public async Task asyncApiCall(string url, object o)
{
    //...
}

否则可能发生的情况是,控制在任务实际执行之前离开using 块,导致任务失败。 (因为client 已被释放。)而且由于从未等待或检查任务,因此不会在任何地方报告失败。

【讨论】:

  • 这正是正在发生的事情。我以为这会是我忘记的一些愚蠢的事情,而且确实如此。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-05
相关资源
最近更新 更多