2017-02-27 24 views
0

目標是使我的定製服務中使用異步方法的控制器。WebAPI:在業務邏輯中使用異步方法

控制器:

[Route("api/data/summary")] 
[HttpGet] 
public async Task<IHttpActionResult> Get() 
{ 
    var result = await DataService.GetDataObjects(); 
    return Ok(result); 
} 

服務:

public static async Task<IEnumerable<DataObject>> GetDataObjects() 
{ 
    var apiKey = "some-api-key"; 
    var path = "path-to-external-service"; 
    using (var client = new HttpClient()) 
    { 
     var dataToProcess = // some data object 

     client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", apiKey); 
     client.BaseAddress = new Uri(path); 

     HttpResponseMessage response = await client.PostAsJsonAsync("", dataToProcess); 
     var content = await response.Content.ReadAsStringAsync(); 

     var result = MakeEntities(content); // some logic 

     return result; 
    } 
} 

但我與控制器的動作之前服務實際完成處理的數據返回空結果問題來了對面。

你能否請教如何正確實施它?

+0

查看代碼看起來並不像控制器動作可以返回結果的服務完成處理數據之前。你可以調試服務,並找出預期的輸出。 –

+1

什麼版本的ASP .NET Web API做喲使用?確保在執行'GetDataObjects'時不會發生異常。 – Pavel

+1

你總是回來好吧,你確定應用程序沒有上升異常嗎? – Tinwor

回答

2

你的代碼是好的,控制器在GetDataObjects返回值之前似乎沒有返回值。

除以下情況:

  1. MakeEntities使用一些異步操作,你不要等待它裏面MakeEntities。所以MakeEntities返回任務。

  2. 代碼運行時異常上升。確保GetDataObjectsMakeEntities的代碼正常工作。

0

目標是使我的自定義服務中使用異步方法的控制器。

控制器:

[HttpGet] 
[Route("api/data/summary")] 
public async Task<IHttpActionResult> Get() 
{ 
    var result = await DataService.GetDataObjects().ConfigureAwait(false); 
    return Ok(result); 
} 

服務:

public static async Task<ResponseEntity> GetDataObjects() 
{ 
    ResponseEntity response = new ResponseEntity(); 
    var apiKey = "some-api-key"; 
    var path = "path-to-external-service"; 
    using (var client = new HttpClient()) 
    { 
     var dataToProcess = // some data object  
     client.BaseAddress = new Uri(path); 
     client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", apiKey); 
     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));  
     HttpResponseMessage response = await client.PostAsJsonAsync("", dataToProcess).ConfigureAwait(false); 
     string responseString = await response.Content.ReadAsStringAsync().ConfigureAwait(false);  
     var result = JsonConvert.DeserializeObject<ResponseEntity>(responseString); 

     return response; 
    } 
}