2017-02-27 8 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アプリケーションのどのような使い方ですか? '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; 
    } 
} 
関連する問題