2015-06-15 30 views
5

Bir çağrıyı PostAsync'e kaydırmaya çalışıyorum, bu yüzden çağrı dizisini kod tabanımın her yerine yeniden yazmak zorunda kalmam. Yaşadığım sorun, çağrıdan tayin ettiğim HttpResponseMessage, yöntem çağrılarımın tüketicisi ile aynı değil. İşte kod:async bir HttpClient.PostAsync çağrısı için bekler

internal class RestHttpClient 
{ 
    public HttpResponseMessage ResponseMessage = new HttpResponseMessage(); 

    public async void SendRequest(string adaptiveUri, string xmlRequest) 
    { 
     using (HttpClient httpClient = new HttpClient()) 
     { 
      StringContent httpConent = new StringContent(xmlRequest, Encoding.UTF8); 

      try 
      { 
       ResponseMessage = await httpClient.PostAsync(adaptiveUri, httpConent); 
      } 
      catch (Exception ex) 
      { 
       ResponseMessage.StatusCode = HttpStatusCode.InternalServerError; 
       ResponseMessage.ReasonPhrase = string.Format("RestHttpClient.SendRequest failed: {0}", ex); 
      } 
     } 
    } 
} 

Ve şöyle yöntemini çağırmak çalışıyorum: Ben arama yaptığınızda bu değil ne olduğunu bile

RestHttpClient restHttpClient = new RestHttpClient(); 

restHttpClient.SendRequest(adaptiveUri, xmlRequest); 

return restHttpClient.ResponseMessage; 

ResponseMessage nesne daima bir Ok durumunu içeren aslında PostAsync çağrısından döndürülür.

+0

@Alexei Bu bir kopya değil. Bu soru OP'nin sorununa cevap vermemesi gereken –

+0

@YuvalItzchakov unvanına dayanmıyor ... ama ... çıkarılmadı. –

cevap

12

Bunun nedeni, yönteminizin async void "fire and forget" biçiminde yürütüldüğü için olmasıdır, bu nedenle PostAsync yanıtının değil yanıt iletisinin gönderilmesiyle döndürülen değeri görüyorsunuz.

Tek bir sınıf HttpResponseMessage alanını göstermeyin, aynı örnekte eşzamanlı olarak çağrılırsa eski olabilir.

public async Task<HttpResponseMessage> SendRequestAsync(string adaptiveUri, string xmlRequest) 
{ 
    using (HttpClient httpClient = new HttpClient()) 
    { 
     StringContent httpConent = new StringContent(xmlRequest, Encoding.UTF8); 

     HttpResponseMessage responseMessage = null; 
     try 
     { 
      responseMessage = await httpClient.PostAsync(adaptiveUri, httpConent); 
     } 
     catch (Exception ex) 
     { 
      if (responseMessage == null) 
      { 
       responseMessage = new HttpResponseMessage(); 
      } 
      responseMessage.StatusCode = HttpStatusCode.InternalServerError; 
      responseMessage.ReasonPhrase = string.Format("RestHttpClient.SendRequest failed: {0}", ex); 
     } 
     return responseMessage; 
    } 
} 

Ve bunu çağırmak zaman düzgün await o: Bunun yerine, yeni bir örneğe her zaman dönmek

return await restHttpClient.SendRequestAsync(adaptiveUri, xmlRequest); 
+0

Stephen Cleary'nin mevcut bir cevabının yinelenmesi gerektiğini biliyorsunuz ... Ama yinelemelerin OP'ye yeterince sevgi göstermediğine katılıyorum. –

+0

Çalışıyor gibi görünüyor ... biraz ama aramadan gördüğüm sonuç şu: yanıtı \t Id = 1, Durum = WaitingForActivation, Yöntem = "{null}", Sonuç = "{Henüz hesaplanmamış}" \t System.Threading.Tasks.Task UI'm sadece bir süreliğine orada duruyor ve servis çağrısından gerçek yanıt alamıyorum. – EricR

+1

Bunu nerede görüyorsunuz? –