Obteniendo contenido / mensaje de HttpResponseMessage

Estoy tratando de obtener contenido de HttpResponseMessage. Debería ser: {"message":"Action '' does not exist!","success":false} , pero no sé cómo sacarlo de HttpResponseMessage.

 HttpClient httpClient = new HttpClient(); HttpResponseMessage response = await httpClient.GetAsync("http://****?action="); txtBlock.Text = Convert.ToString(response); //wrong! 

En este caso, txtBlock tendría valor:

 StatusCode: 200, ReasonPhrase: 'OK', Version: 1.1, Content: System.Net.Http.StreamContent, Headers: { Vary: Accept-Encoding Keep-Alive: timeout=15, max=100 Connection: Keep-Alive Date: Wed, 10 Apr 2013 20:46:37 GMT Server: Apache/2.2.16 Server: (Debian) X-Powered-By: PHP/5.3.3-7+squeeze14 Content-Length: 55 Content-Type: text/html } 

Debe llamar a GetResponse () .

 Stream receiveStream = response.GetResponseStream (); StreamReader readStream = new StreamReader (receiveStream, Encoding.UTF8); txtBlock.Text = readStream.ReadToEnd(); 

Creo que el enfoque más fácil es simplemente cambiar la última línea a

 txtBlock.Text = await response.Content.ReadAsStringAsync(); //right! 

De esta forma, no es necesario que introduzca ningún lector de flujo y no necesita ningún método de extensión.

Intenta esto, puedes crear un método de extensión como este:

  public static string ContentToString(this HttpContent httpContent) { var readAsStringAsync = httpContent.ReadAsStringAsync(); return readAsStringAsync.Result; } 

y luego, simple llame al método de extensión:

 txtBlock.Text = response.Content.ContentToString(); 

Espero que esto te ayude 😉

Si desea convertirlo a un tipo específico (por ejemplo, dentro de las pruebas) puede usar el método de extensión ReadAsAsync :

 object yourTypeInstance = await response.Content.ReadAsAsync(typeof(YourType)); 

o siguiente para el código síncrono:

 object yourTypeInstance = response.Content.ReadAsAsync(typeof(YourType)).Result; 

Actualización: también hay una opción genérica de ReadAsAsync <> que devuelve una instancia de tipo específico en lugar de una declarada como objeto:

 YourType yourTypeInstance = await response.Content.ReadAsAsync(); 

Puede usar el método GetStringAsync :

 var uri = new Uri("http://yoururlhere"); var response = await client.GetStringAsync(uri);