2016-03-07 138 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