2012-11-04 3 views
18

からのHttpClientを使用して外部HTTPサービスを呼び出します確かに私が持っている問題を動作しないプライベートメソッドのコードは、コントローラの取得は、()のGetResponseを呼び出すことですが私は(次のようにサンプルコード <p></p> 4.5の.NET Framework上で動作しているASP.Net MVC 4のWeb APIプロジェクトがある内からのHttpClientを使用して外部サービスを呼び出していたWeb APIアクション

public class ValuesController : ApiController 
{ 
    static string _address = "http://api.worldbank.org/countries?format=json"; 
    private string result; 

    // GET api/values 
    public IEnumerable<string> Get() 
    { 
     GetResponse(); 
     return new string[] { result, "value2" }; 
    } 

    private async void GetResponse() 
    { 
     var client = new HttpClient(); 
     HttpResponseMessage response = await client.GetAsync(_address); 
     response.EnsureSuccessStatusCode(); 
     result = await response.Content.ReadAsStringAsync(); 
    } 
} 

)(:これは、外部サービスを呼び出してテストするためのサンプルコード)であるとして戻り値を無視します結果を待つのではなく、result = nullの戻り値をすぐに実行します。

次のように私はまた、Webクライアントとの単純な同期呼び出しを使用して試してみました:正常に動作します

// GET api/values 
    public IEnumerable<string> Get() 
    { 
     //GetResponse(); 

     var client = new WebClient(); 

     result = client.DownloadString(_address); 

     return new string[] { result, "value2" }; 
    } 

私は間違っていますか?なぜGet()は非同期サンプルのプライベートメソッド補完を待っていないのですか?

+0

あなたはawaitでもGetResponse()を呼び出す必要はありませんか?さもなければ、それはそのメソッドが終了するのを待つことはありません。そして、あなたのコントローラのアクションは、結果をそのままnullのままにして終了します。 – jishi

+0

はい、私はGet()をawaitを使用するのに必要な非同期としてマークすることができたことに気づいていませんでした。 – Redeemed1

答えて

30

なるほど、私は(というし、ボイドタスクを返す)次の操作を実行するために必要な:

// GET api/values 
    public async Task<IEnumerable<string>> Get() 
    { 
     var result = await GetExternalResponse(); 

     return new string[] { result, "value2" }; 
    } 

    private async Task<string> GetExternalResponse() 
    { 
     var client = new HttpClient(); 
     HttpResponseMessage response = await client.GetAsync(_address); 
     response.EnsureSuccessStatusCode(); 
     var result = await response.Content.ReadAsStringAsync(); 
     return result; 
    } 

また、私は私が私を許可するものである非同期としてのGet()操作をマーク可能性が実現していませんでした外部呼び出しを待ちます。

ブログの記事Async and Awaitのスティーブン・クリアリーのおかげで正しい方向に私を指摘しました。

+0

私は過去3日間から何を探していたのですか?一度あなたがそれを知っているシンプル:最も短く、最も効果的な答え。 –

0

ユーザー名とパスワードでHttpclientを呼び出します。 APIに必要な認証の場合。

public async Task<ActionResult> Index() 
{ 

      const string uri = "https://testdoamin.zendesk.com/api/v2/users.json?role[]=agent"; 
      using (var client1 = new HttpClient()) 
      { 
       var header = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes("[email protected]:123456")));///username:password for auth 
       client1.DefaultRequestHeaders.Authorization = header; 
       var aa = JsonConvert.DeserializeObject<dynamic>(await client1.GetStringAsync(uri)); 

      } 
} 
+0

カラン、ここにあなたの努力をありがとうが、これは質問に関連していません。あなたの応答は認証に関係します。質問は非認証のAPIの周りの非同期タスクに関するものです – Redeemed1

関連する問題