异步API调用失败

aar*_*ron 0 c# asp.net asp.net-web-api2

我有两种方法来进行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);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

但是,我也有一个打算进行异步调用的方法.它最初名为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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

总结:我的同步调用正在运行,我的异步调用失败.我想我做错了,但是我能找到的所有文档都暗示HttpClient的PostAsJsonAsync方法默认是异步的.从逻辑上讲,我希望(并且已经看到很多人的情况)存在相反的问题.

Dav*_*vid 5

这需要等待:

await client.PostAsJsonAsync(url, o);
Run Code Online (Sandbox Code Playgroud)

这意味着需要async:

public async Task asyncApiCall(string url, object o)
{
    //...
}
Run Code Online (Sandbox Code Playgroud)

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