2016-10-13 10 views
3

私の要求/応答を記録したいが問題がある。 私の要求は、なぜ私は分かりませんでした。私のコントローラ内部C#HttpClient tracing stuck

私はこのコード

var log = new LoggingHandler(); 

using (var client = new HttpClient(log))// <-- problem here 
{ 

    string baseUrl = ConfigurationManager.AppSettings["apiBaseAddress"]; 
    client.BaseAddress = new Uri(baseUrl); 
    client.DefaultRequestHeaders.Accept.Clear(); 
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

    foreach (var website in websitesList) 
    { 
     string stringtime = TimeHandler.GetCurrentDateTime(); 

     var userModel = new RegisterModel() 
     { 
      // my user model 
     }; 

     var content = new FormUrlEncodedContent(new[] 
     { 
       //encoding model 
     }); 



     try 
     { 
      HttpResponseMessage response = client.PostAsync("api/UserDetails/Register", content).Result; 

      //tResult.URL = response.RequestMessage.RequestUri.OriginalString; 
      tResult.URL = website.URL; 
      tResult.Result = response.ReasonPhrase; 

      var statusCode = response.StatusCode.ToString(); 

      . 
      . 
      . 
      . 
     } 

     tResult.TestLog = log.GetLog();//***** 

     resultList.Add(tResult); 
    } 
} 

と私のLoggingHandler

public class LoggingHandler : DelegatingHandler 
{ 
    StringBuilder sb = new StringBuilder(); 

    public LoggingHandler() 
     : base(new HttpClientHandler()) 
    { 
    } 

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 

     sb.AppendLine("Request:"); 
     sb.AppendLine(request.ToString()); 
     if (request.Content != null) 
     { 
      sb.AppendLine(await request.Content.ReadAsStringAsync()); 
     } 
     sb.AppendLine(); 

     HttpResponseMessage response = await base.SendAsync(request, cancellationToken); 

     sb.AppendLine("Response:"); 
     sb.AppendLine(response.ToString()); 
     if (response.Content != null) 
     { 
      sb.AppendLine(await response.Content.ReadAsStringAsync()); 
     } 
     sb.AppendLine(); 

     return response; 
    } 

    public string GetLog() 
    { 
     return sb.ToString(); 
    } 
} 

私のデバッグがで立ち往生しました:

HttpResponseMessage response = await base.SendAsync(request, cancellationToken); 

誰かがいくつかの光を入れて、私に説明していただけますがなぜそれが固まったの?
助けを歓迎します。

+1

LoggingHandler.SendAsyncはどこにありますか? ASP.Netには、await/asyncパターンにいくつかの制限があります。どこかでデッドロックが発生していると思います。 – gobes

+0

LoggingHandlerタイプのログを作成しています。 var log = new LoggingHandler(); と私はhttpclient(ログ)を作成して – Bglen

+0

私はそれを参照してください、しかしあなたのコントローラで 'SendAsync'ではなく' PostAsync'を呼び出しています。 Nkosi氏によると、待たされるメソッドで '.Result'(またはブロッキングメソッドやプロパティ)を呼び出すことは、ASP.Netでは非常に悪く、ほとんどの時間がデッドロックにつながります。 – gobes

答えて

1

.Resultを使用すると、同期と非同期の呼び出しが混在しています。

HttpResponseMessage response = client.PostAsync("api/UserDetails/Register", content).Result; 

これがデッドロックの原因です。

すべて非同期または非同期で実行します。

var response = await client.PostAsync("api/UserDetails/Register", content); 
+0

私のコード行をあなたのものに変更しましたが、私の関数は非同期1ではありません、それはアクション結果です。public ActionResult TestApiRegistration() – Bglen

+0

cant edit。 アクション結果型メソッドです。 非同期メソッドに変更する必要がありますか? – Bglen

+0

はい。 'async Task '戻り値の型に変更する – Nkosi