2016-03-07 144 views
0

我有两种方法进行API调用。第一个巧妙命名的apiCall,完全按照预期工作。我传递一个字符串URL和对象后,在调用时,我收到一个HttpResponseMessage类对象:异步API调用失败

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方法在默认情况下是异步的。从逻辑上讲,我期望(并且看到很多人有这种情况)出现相反的问题。

+3

你需要给你的'client.PostAsJsonAsync()'调用添加一个'await'。正如你所知道的那样,我会想象在'PostAsJsonAsync()'完成之前'HttpClient'已经被放置了。 –

回答

5

这需要等待:

await client.PostAsJsonAsync(url, o); 

这意味着这必须是async

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

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

+0

这正是发生的事情。我认为它是我忘记的东西,事实就是如此。 – aaron