2017-12-24 34 views
2

작동하지 기다리고 있습니다.C# HttpClient를 PostAsync 비동기와 WebApi 1 WebApi 2에 게시하려고 <code>HttpClient</code><code>PostAsync</code>을 사용하고 <code>async</code> 및 <code>await</code>를 사용할 때이 교착 상태로 실행하고

public HttpResponseMessage Get([FromUri]int oid) 
{ 
    var orderdetails = _orderServices.GetOrderDetails(oid); 

    var xml = new XmlMediaTypeFormatter(); 
    xml.UseXmlSerializer = true; 
    string orderdetailsser = Serialize(xml, orderdetails); 

    var result = PostXml(orderdetailsser); 

    return Request.CreateResponse(HttpStatusCode.OK); 
} 

public static async Task<HttpResponseMessage> PostXml(string str) 
{ 
    using (var client = new HttpClient()) 
    { 

     client.BaseAddress = new Uri("http://localhost:58285/"); 

     var content = new StringContent(str); 
     var response = await client.PostAsync("api/default/ReceiveXml", content).ConfigureAwait(false); 
     return response; 
    } 

} 

그리고 WebApi2 :

[System.Web.Http.HttpPost] 
public HttpResponseMessage ReceiveXml(HttpRequestMessage request) 
{ 

    var xmlDoc = new XmlDocument(); 
    xmlDoc.Load(request.Content.ReadAsStreamAsync().Result); 

    xmlDoc.Save(@"C:\xmlfiles\xml2.xml"); 

    XmlSerializer deserializer = new XmlSerializer(typeof(OrderInfoModel)); 
    TextReader reader = new StreamReader(@"C:\xmlfiles\xml2.xml"); 
    object obj = deserializer.Deserialize(reader); 
    OrderInfoModel orderdetails = (OrderInfoModel)obj; 
    reader.Close(); 

    var patient_id = _patientServices.ProcessPatient(orderdetails.Patient, orderdetails.OrderInfo); 
    var orderid = _orderServices.ProcessOrder(orderdetails.Patient, orderdetails.OrderInfo, patient_id); 

    if (orderdetails.OrderNotes != null && orderdetails.OrderNotes.Count() > 0) 
    { 
     var success = _orderServices.ProcessOrderNotes(orderid, orderdetails.OrderNotes); 
    } 

    var prvid = _orderServices.ProcessOrderProvider(orderid, orderdetails.ReferringProvider); 

    var shpngid = _orderServices.ProcessOrderShipping(orderid, orderdetails.ShippingInfo); 

    var payerid = _orderServices.ProcessOrderPayer(orderid, orderdetails.Insurances); 

    return Request.CreateResponse(HttpStatusCode.OK, orderid); 
} 

내가 WebAPI 2에서 다시 WebAPI 1에 대한 반응을 얻고 있지 않다 나는 여러 기사를 통해 갈

다음은 WebAPI 1입니다 교착 상태 상황에 대한 온라인. 그러나, 나는 나의 경우에 교착 상태를 해결할 수 없습니다. 여기서 내가 뭘 잘못하고 있니? asyncawait을 제대로 사용하고 있습니까?

+0

는 https://stackoverflow.com/questions/17248680/await-works-but-calling에서 클래식 교착 상황, 답변을 것 같은데 -task-result-hangs-deadlocks –

+0

안녕하세요 Orel Eraki - 내가 제안한 기사를 읽었습니다. 교착 상태를 해결할 수 없습니다. –

+0

[작업 대기 중이지만 호출 대기중인 작업의 가능한 복제본입니다. 결과가 응답하지 않습니다/교착 상태] (https://stackoverflow.com/questions/17248680/await-works-but-calling-task-result-hangs-deadlocks) –

답변

0

위 내 의견을 작성하려면 async 작업에서 차단하지 않도록 코드를 수정하십시오. 또한 _orderServices.GetOrderDetails(oid);은 데이터베이스에 접근하는 방법과 비슷하므로 데이터베이스 액세스에 사용할 수있는 async API를 사용하는 await _orderServices.GetOrderDetailsAsync(oid);이어야합니다.

[HttpGet()] 
public async Task<HttpResponseMessage> Get([FromUri]int oid) { 
    var orderdetails = _orderServices.GetOrderDetails(oid); 

    var xml = new XmlMediaTypeFormatter(); 
    xml.UseXmlSerializer = true; 
    string orderdetailsser = Serialize(xml, orderdetails); 

    var result = await PostXml(orderdetailsser); 

    return Request.CreateResponse(HttpStatusCode.OK); 
} 

public static async Task<HttpResponseMessage> PostXml(string str) { 
    using(var client = new HttpClient()) { 

     client.BaseAddress = new Uri("http://localhost:58285/"); 

     var content = new StringContent(str); 
     var response = await client.PostAsync("api/default/ReceiveXml", content).ConfigureAwait(false); 
     return response; 
    } 

} 

[HttpPost()] 
public async Task<HttpResponseMessage> ReceiveXml(HttpRequestMessage request) { 

    var xmlDoc = new XmlDocument(); 
    xmlDoc.Load(await request.Content.ReadAsStreamAsync()); 

    xmlDoc.Save(@"C:\xmlfiles\xml2.xml"); 

    XmlSerializer deserializer = new XmlSerializer(typeof(OrderInfoModel)); 
    TextReader reader = new StreamReader(@"C:\xmlfiles\xml2.xml"); 
    object obj = deserializer.Deserialize(reader); 
    OrderInfoModel orderdetails = (OrderInfoModel)obj; 
    reader.Close(); 

    var patient_id = _patientServices.ProcessPatient(orderdetails.Patient, orderdetails.OrderInfo); 
    var orderid = _orderServices.ProcessOrder(orderdetails.Patient, orderdetails.OrderInfo, patient_id); 

    if(orderdetails.OrderNotes != null && orderdetails.OrderNotes.Count() > 0) { 
     var success = _orderServices.ProcessOrderNotes(orderid, orderdetails.OrderNotes); 
    } 

    var prvid = _orderServices.ProcessOrderProvider(orderid, orderdetails.ReferringProvider); 

    var shpngid = _orderServices.ProcessOrderShipping(orderid, orderdetails.ShippingInfo); 

    var payerid = _orderServices.ProcessOrderPayer(orderid, orderdetails.Insurances); 

    return Request.CreateResponse(HttpStatusCode.OK, orderid); 
} 

자원

Don't Block on Async Code

Avoid Async Void

+0

안녕하세요. J Steward - 도와 주셔서 감사합니다. 나는 마침내 그것을 알아낼 수있었습니다. 잘못 배치 된 중단 점뿐 아니라 API 2에서도 기다리고있었습니다. 그러나 비동기 배치가 필요한 부분을 정확하게 지적함으로써 하루를 보냈습니다. 메리 크리스마스! –