Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步API调用失败_C#_Asp.net_Asp.net Web Api2 - Fatal编程技术网

C# 异步API调用失败

C# 异步API调用失败,c#,asp.net,asp.net-web-api2,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

我有两种方法来进行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(url, o);
这意味着这需要是异步的:

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

否则,可能发生的情况是,控件在任务实际执行之前使用块离开
,导致任务失败。(因为
客户端
已被释放。)而且因为任务从未等待或检查过,所以故障不会在任何地方报告。

这需要等待:

await client.PostAsJsonAsync(url, o);
这意味着这需要是异步的:

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

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

您需要向
客户端.PostAsJsonAsync()
调用添加
wait
。正如您所拥有的,我可以想象在您的
PostAsJsonAsync()
完成之前,
HttpClient
正在被处理。您需要向您的
client.PostAsJsonAsync()
调用添加一个
wait
。正如您所看到的,我可以想象
HttpClient
将在您的
PostAsJsonAsync()
完成之前被处理掉。这正是发生的事情。我本以为这是我忘记的愚蠢的事情,但事实确实如此。这正是发生的事情。我原以为这是我忘记的愚蠢的事情,但事实确实如此。