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
}
Content
Eigenschaft zu verwenden. Schauen Sie sich das Beispiel hier an . Scrollen Sie zum zweiten Schritt.HttpClient
, nichtHttpWebRequest
/HttpWebResponse
.Ich denke, der einfachste Ansatz besteht darin, nur die letzte Zeile in zu ändern
Auf diese Weise müssen Sie keine Stream-Reader einführen und benötigen keine Erweiterungsmethoden.
quelle
Versuchen Sie dies, Sie können eine Erweiterungsmethode wie folgt erstellen:
und rufen Sie dann einfach die Erweiterungsmethode auf:
Ich hoffe das hilft dir ;-)
quelle
await
anstelle 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.Wenn Sie es in einen bestimmten Typ umwandeln möchten (z. B. innerhalb von Tests), können Sie die ReadAsAsync- Erweiterungsmethode verwenden:
oder folgendes für synchronen Code:
Update: Es gibt auch eine generische Option von ReadAsAsync <>, die eine bestimmte Typinstanz anstelle einer vom Objekt deklarierten zurückgibt:
quelle
Durch die Antwort von rudivonstaden
Wenn Sie die Methode jedoch nicht asynchronisieren möchten, können Sie sie verwenden
Warten Sie (), es ist wichtig, da wir asynchrone Vorgänge ausführen und warten müssen, bis die Aufgabe abgeschlossen ist, bevor Sie fortfahren.
quelle
.Result
einem anderen?,httpContent.ReadAsStringAsync().Result
.Result
würde die Ausführung des Threads in dieser ZeiletxtBlock.Text.Wait()
blockieren ... wo als Blöcke auf dem wait () -Aufruf ... also haben Sie Recht, dass es im Grunde keinen Unterschied gibt. Ich vermutetxtBlock.Text.Wait()
jedoch, dass ein optionaler Integer-Parameter verwendet wird, damit die GUI nicht hängen bleibt, wenn der vorherigeReadAsStringAsync()
Aufruf nie zurückgegeben wird. Zum Beispiel würde das Folgende nicht länger als 1 SekundetxtBlock.Text.Wait(1000)
Die schnelle Antwort, die ich vorschlage, lautet:
response.Result.Content.ReadAsStringAsync().Result
quelle
Result
Aufgaben an. Sie riskieren, Ihre Anwendung zu sperren. Verwenden Sie stattdessen async / await.ReadAsStringAsync()
eingehen, nicht zurückzukehren. Rufen Sie es daher nicht auf Ihrer GUI oder im Hauptanwendungsthread auf.Ich denke, das folgende Bild hilft für diejenigen, die
T
als Rückgabetyp vorbeikommen müssen.quelle
Sie können die
GetStringAsync
Methode verwenden:quelle