2016-05-11 13 views
7

ボタンクリックでASP.NETページからWeb APIを呼び出しました。 これは完全に私がどこかで読んだことがあるものの、それはasyncないとして、それはデッドロックが作成されます正常に動作している(ラインclient.PostAsJsonAsync(url, sd).Result;.Resultの使用に起因する)Web APIをアプリケーションから呼び出す

は、このコードを更新するための最良の方法を提案してください。

private void CallApi(SurveyData sd) 
{ 

    using (var client = new HttpClient()) 
    {     

     string url = ConfigurationManager.AppSettings.Get("url"); 
     client.DefaultRequestHeaders.Accept.Clear(); 

     var response = client.PostAsJsonAsync(url, sd).Result; 

     if (response.IsSuccessStatusCode) 
     { 
      Response.Write("Success"); 
     } 
     else 
     { 
      Response.Write(response.StatusCode + " : Message - " + response.ReasonPhrase); 
     } 
    } 
} 
+0

で構成されたベースURLとAPIメソッドを処理するための汎用的な方法として書き始めている

public async Task<HttpResponseMessage> GetHttpClientResult<T>(string baseUrl, string url, T requestParam, bool isExternalLink = false, string acceptMediaVerb = "application/json", HttpMethod requestMethod = null) { try { HttpClient client = new HttpClient(); HttpResponseMessage response = new HttpResponseMessage(); if (!isExternalLink) { client.BaseAddress = new Uri(baseUrl); } if (!string.IsNullOrEmpty(acceptMediaVerb)) { if (acceptMediaVerb == "application/json") { client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); if (requestMethod == HttpMethod.Get || requestMethod == null) { response = client.GetAsync(url).Result; } else if (requestMethod == HttpMethod.Post) { response = await client.PostAsJsonAsync(url, requestParam); } } } var context = new HttpContextWrapper(HttpContext.Current); HttpRequestBase request = context.Request; return response; } catch { return new HttpResponseMessage(System.Net.HttpStatusCode.BadRequest); } } 

この方法で試してくださいはい、行、var response = client.PostAsJsonAsync(url、sd).Result;応答を待たなければならない。 webapiで非同期コントローラオプションを使用できます。 – Saadi

+0

わかりませんが、 'CallApi'メソッドを' async'メソッドにして、そのメソッドを使って 'await'を使うとどうなりますか? – Raghuveer

+2

MVCでない場合は、メソッドを非同期化してからclient.PostAsJsonAsyncを待つことができます。一般的です(私はそれを理解しているので、voidメソッドを非同期としてマークするのは悪い習慣です)。 – Tim

答えて

1

asyncを使用しない場合は、HttpClientではなくWebClientを使用できます。

WebClient client = new WebClient(); 
string response = client.UploadString(RequestUrl, "POST", data); 
0

あなたは(私はstringの戻り値の型提供することをお勧めしたい、その場合には)asyncメソッドとして書き換えることができます:次に

private async Task<string> CallApi(SurveyData sd) 
{ 

    string result = String.Empty; 

    using (var client = new HttpClient()) 
    { 

     string url = ConfigurationManager.AppSettings["url"]; 
     client.DefaultRequestHeaders.Accept.Clear(); 

     var response = await client.PostAsJsonAsync(url, sd); 

     if (response.IsSuccessStatusCode) 
     { 
      result = "Success"; 
     } 
     else 
     { 
      result = response.StatusCode + " : Message - " + response.ReasonPhrase; 
     } 
    } 

    return result; 
} 

をあなた可能性もawaitこの呼び出しの結果:

Response.Write(await CallApi(sd)); 

コールは別のasyncメソッド内から作られる必要があるだろうけど。それ以外の場合はResponse.Write(CallApi(sd).Result);を実行しなければなりません。その場合、パフォーマンスが大幅に向上するかどうかはわかりません。

+0

'async'メソッドは' string'を返すことができません。代わりに 'Task 'を返さなければなりません。あなたの答えに戻り値の型を修正してください。 –

+0

@FedericoDipuma - 修正してください。キャッチありがとう:) – Tim

0

あなたはこれがあなたのアプリケーション自体または任意の外部のWeb要求

関連する問題