Abrufen von Inhalten / Nachrichten von HttpResponseMessage

175

Ich versuche, Inhalte von HttpResponseMessage abzurufen. Es sollte sein {"message":"Action '' does not exist!","success":false}:, aber ich weiß nicht, wie ich es aus HttpResponseMessage herausholen kann.

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

In diesem Fall hätte txtBlock den Wert:

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

Antworten:

66

Sie müssen GetResponse () aufrufen .

Stream receiveStream = response.GetResponseStream ();
StreamReader readStream = new StreamReader (receiveStream, Encoding.UTF8);
txtBlock.Text = readStream.ReadToEnd();
Icemanind
quelle
33
Danke, aber warum erhalte ich diesen Fehler hier: "System.Net.Http.HttpResponseMessage" enthält keine Definition für 'GetResponseStream' und keine Erweiterungsmethode 'GetResponseStream', die ein erstes Argument vom Typ 'System.Net.Http.HttpResponseMessage' akzeptiert. gefunden werden "
Clem
13
@Klemzy - Weil du es asynchron nennst. Versuchen Sie stattdessen, die ContentEigenschaft zu verwenden. Schauen Sie sich das Beispiel hier an . Scrollen Sie zum zweiten Schritt.
Icemanind
2
@Klemzy - Sehen Sie sich das Beispiel hier an . Scrollen Sie zum zweiten Schritt. Wenn Sie es nicht herausfinden können, werde ich meine Antwort bearbeiten und Ihnen ein Beispiel für Sie geben
Icemanind
17
Diese Antwort ist völlig unangebracht, das OP verwendet HttpClient, nicht HttpWebRequest/ HttpWebResponse.
Maxime Rossini
1
Die Frage bezieht sich auf HttpCient. Ihre Antwort basiert auf veraltetem und veraltetem HttpWebRequest.
Payam
370

Ich denke, der einfachste Ansatz besteht darin, nur die letzte Zeile in zu ändern

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

Auf diese Weise müssen Sie keine Stream-Reader einführen und benötigen keine Erweiterungsmethoden.

rudivonstaden
quelle
5
Ich bin mir nicht sicher, warum dies nicht die akzeptierte Antwort ist, zumal Sie auf diese Weise Inhalte einfach in Ihre Objekte serialisieren können.
Jason McKindly
3
ReadAsStringAsync behandelt Fehler meiner Meinung nach nicht gut.
Stannius
16
Sie können auch Response.Content.ReadAsStringAsync () verwenden. Result anstelle von await
Justin
8
Achtung: ReadAsStringAsync () kann auslösen, wenn die Antwort Emoticons oder andere Unicode-Zeichen enthält. Ich musste Streams verwenden (wie in der akzeptierten Antwort), um das zu überwinden.
Ginkgo
41

Versuchen Sie dies, Sie können eine Erweiterungsmethode wie folgt erstellen:

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

und rufen Sie dann einfach die Erweiterungsmethode auf:

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

Ich hoffe das hilft dir ;-)

MCurbelo
quelle
Bei weitem am einfachsten in Betrieb zu nehmen
Aage
Bitte verwenden Sie awaitanstelle von .Result... oder verwenden Sie stattdessen einen synchronen HTTP-Client, wenn Ihr Code keine asynchrone Programmierung verarbeiten kann. Aber jeder moderne Code sollte es tun, sonst könnte es ein Zeichen dafür sein, dass Ihre Anwendung etwas falsch macht.
Maxime Rossini
9

Wenn Sie es in einen bestimmten Typ umwandeln möchten (z. B. innerhalb von Tests), können Sie die ReadAsAsync- Erweiterungsmethode verwenden:

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

oder folgendes für synchronen Code:

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

Update: Es gibt auch eine generische Option von ReadAsAsync <>, die eine bestimmte Typinstanz anstelle einer vom Objekt deklarierten zurückgibt:

YourType yourTypeInstance = await response.Content.ReadAsAsync<YourType>();
Taras-Mytofir
quelle
2
object yourTypeInstance = warte auf Antwort.Content.ReadAsAsync (typeof (YourType)); sollte var yourTypeInstance = warte auf Antwort.Content.ReadAsAsync <IhrTyp> ();
Thomas.Benz
Ich habe Request.Content.ReadAsAsync verwendet, um Json zu analysieren, und habe eine schreckliche Leistung erzielt.
W.Leto
4

Durch die Antwort von rudivonstaden

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

Wenn Sie die Methode jedoch nicht asynchronisieren möchten, können Sie sie verwenden

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

Warten Sie (), es ist wichtig, da wir asynchrone Vorgänge ausführen und warten müssen, bis die Aufgabe abgeschlossen ist, bevor Sie fortfahren.

stanimirsp
quelle
3
mit .Resulteinem anderen?,httpContent.ReadAsStringAsync().Result
mkb
.Resultwürde die Ausführung des Threads in dieser Zeile txtBlock.Text.Wait()blockieren ... wo als Blöcke auf dem wait () -Aufruf ... also haben Sie Recht, dass es im Grunde keinen Unterschied gibt. Ich vermute txtBlock.Text.Wait()jedoch, dass ein optionaler Integer-Parameter verwendet wird, damit die GUI nicht hängen bleibt, wenn der vorherige ReadAsStringAsync()Aufruf nie zurückgegeben wird. Zum Beispiel würde das Folgende nicht länger als 1 Sekunde txtBlock.Text.Wait(1000)
blockieren
3

Die schnelle Antwort, die ich vorschlage, lautet:

response.Result.Content.ReadAsStringAsync().Result

benhorgen
quelle
Rufen Sie KEINE ResultAufgaben an. Sie riskieren, Ihre Anwendung zu sperren. Verwenden Sie stattdessen async / await.
eltiare
Ich würde nicht nie sagen ... manchmal wird es schnell und schmutzig erledigt. Ich bin jedoch damit einverstanden, dass Sie das Risiko ReadAsStringAsync()eingehen, nicht zurückzukehren. Rufen Sie es daher nicht auf Ihrer GUI oder im Hauptanwendungsthread auf.
benhorgen
1

Ich denke, das folgende Bild hilft für diejenigen, die Tals Rückgabetyp vorbeikommen müssen.

Geben Sie hier die Bildbeschreibung ein

snr
quelle
0

Sie können die GetStringAsyncMethode verwenden:

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