web-dev-qa-db-fra.com

Obtention de contenu / message de HttpResponseMessage

J'essaie d'obtenir le contenu de HttpResponseMessage. Ce devrait être: {"message":"Action '' does not exist!","success":false}, mais je ne sais pas comment le sortir de HttpResponseMessage.

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

Dans ce cas, txtBlock aurait une valeur:

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
}
144
Clem

Vous devez appeler GetResponse () .

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

Je pense que l’approche la plus simple consiste à changer la dernière ligne en

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

De cette façon, vous n'avez pas besoin d'introduire de lecteurs de flux et vous n'avez besoin d'aucune méthode d'extension.

314
rudivonstaden

Essayez ceci, vous pouvez créer une méthode d’extension comme celle-ci:

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

et ensuite, appelez simplement la méthode d'extension:

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

J'espère que cela vous aide ;-)

35
MCurbelo

Si vous souhaitez le convertir en un type spécifique (par exemple, au sein de tests), vous pouvez utiliser la méthode d'extension ReadAsAsync :

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

ou suivant pour le code synchrone:

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

Mise à jour: il existe également une option générique de ReadAsAsync <> qui renvoie une instance de type spécifique au lieu d'une instance déclarée par l'objet:

YourType yourTypeInstance = await response.Content.ReadAsAsync<YourType>();
7
taras-mytofir

Par la réponse de rudivonstaden

`txtBlock.Text = await response.Content.ReadAsStringAsync();`

mais si vous ne voulez pas rendre la méthode async, vous pouvez utiliser

`txtBlock.Text = response.Content.ReadAsStringAsync();
 txtBlock.Text.Wait();`

Wait () c'est important, car nous faisons des opérations asynchrones et nous devons attendre que la tâche soit terminée avant de continuer.

1
stanimirsp

Vous pouvez utiliser la méthode GetStringAsync:

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