2015-06-15 8 views
5

Sto provando a racchiudere una chiamata a PostAsync in modo da non dover ricodificare la sequenza di chiamate su tutto il mio codice base. Il problema che sto riscontrando è HttpResponseMessage che ho assegnato dalla chiamata non è uguale a quello che il consumatore del mio metodo chiama. Ecco il codice:async attendo per una chiamata HttpClient.PostAsync

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

E io sto cercando di chiamare il metodo come segue:

RestHttpClient restHttpClient = new RestHttpClient(); 

restHttpClient.SendRequest(adaptiveUri, xmlRequest); 

return restHttpClient.ResponseMessage; 

Quando faccio la chiamata all'oggetto responseMessage contiene sempre uno stato Ok, anche se questo non è ciò che viene effettivamente restituito dalla chiamata PostAsync.

+0

@Alexei Questo non è un duplicato. Questa domanda non risponde affatto al problema dell'OP –

+0

@YuvalItzchakov in base al titolo che dovrebbe ... ma non ... rimosso. –

risposta

12

Il motivo per cui si sta verificando questo è perché il metodo è async void che viene eseguito in modalità "ignora e dimentica", quindi viene visualizzato il valore restituito dall'instradamento del messaggio di risposta, non dalla risposta di PostAsync.

Non esporre un campo di classe singola HttpResponseMessage, potrebbe essere obsoleto se chiamato contemporaneamente nella stessa istanza. Invece, restituire una nuova istanza ogni volta:

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

E quando lo si richiama, correttamente await esso:

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

Sai che dovrebbe essere il duplicato di alcune risposte esistenti di Stephen Cleary ... Ma sono d'accordo sul fatto che i duplicati non mostrano abbastanza amore per OP. –

+0

Sembra funzionare .. un po 'ma il risultato che vedo dalla chiamata è: risposta \t Id = 1, Stato = WaitingForActivation, Method = "{null}", Result = "{Non ancora calcolato}" \t System.Threading.Tasks.Task Il mio UI rimane seduto per un momento e non ricevo la risposta effettiva dalla chiamata di servizio. – EricR

+1

Dove lo vedi? –

Problemi correlati