2016-10-13 5 views
3

내 요청/응답을 기록하고 싶지만 문제가 있습니다. 내 요청이 이유를 모르겠다.C# HttpClient tracing stuck

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

사람이 어떤 빛을 넣어 설명해 주시겠습니까 : 내 컨트롤러 내부

나는

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(); 
    } 
} 

내 디버그에 붙어

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이 코드를했습니다 왜 막혔어?
어떤 도움을 주셔서 감사합니다.

+1

LoggingHandler.SendAsync는 어디에 호출됩니까? ASP.Net에는 await/async 패턴에 대한 몇 가지 제한 사항이 있습니다. 어딘가에 교착 상태가 있다고 가정합니다. – gobes

+0

LoggingHandler 유형 인 Log를 작성하고 있습니다. var log = new LoggingHandler(); 그리고 내가 httpclient (log)를 만드는 중 – 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