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
}
Vous devez appeler GetResponse () .
Stream receiveStream = response.GetResponseStream ();
StreamReader readStream = new StreamReader (receiveStream, Encoding.UTF8);
txtBlock.Text = readStream.ReadToEnd();
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.
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 ;-)
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>();
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.
Vous pouvez utiliser la méthode GetStringAsync
:
var uri = new Uri("http://yoururlhere");
var response = await client.GetStringAsync(uri);