Próbuję uzyskać zawartość HttpResponseMessage. Powinno być: {"message":"Action '' does not exist!","success":false}
ale nie wiem, jak to wyciągnąć z HttpResponseMessage.
HttpClient httpClient = new HttpClient();
HttpResponseMessage response = await httpClient.GetAsync("http://****?action=");
txtBlock.Text = Convert.ToString(response); //wrong!
W tym przypadku txtBlock miałby wartość:
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
Zamiast tego spróbuj użyć właściwości. Spójrz na przykład tutaj . Przewiń w dół do drugiego kroku.HttpClient
, a nieHttpWebRequest
/HttpWebResponse
.Myślę, że najłatwiejszym sposobem jest zmiana ostatniej linii na
W ten sposób nie musisz wprowadzać żadnych czytników strumieniowych i nie potrzebujesz żadnych metod rozszerzających.
źródło
Spróbuj tego, możesz utworzyć taką metodę rozszerzenia:
a następnie po prostu wywołaj metodę rozszerzenia:
Mam nadzieję, że to pomoże ;-)
źródło
await
zamiast.Result
... lub zamiast tego użyj synchronicznego klienta HTTP, jeśli Twój kod nie obsługuje programowania asynchronicznego. Ale każdy nowoczesny kod powinien, w przeciwnym razie może to oznaczać, że Twoja aplikacja robi coś źle.Jeśli chcesz rzutować go na określony typ (np. W ramach testów) możesz użyć metody rozszerzenia ReadAsAsync :
lub następujące dla kodu synchronicznego:
Aktualizacja: istnieje również ogólna opcja ReadAsAsync <>, która zwraca określone wystąpienie typu zamiast zadeklarowanego przez obiekt:
źródło
Odpowiedzią rudivonstaden
ale jeśli nie chcesz, aby metoda była asynchroniczna, możesz użyć
Wait () jest to ważne, ponieważ wykonujemy operacje asynchroniczne i musimy poczekać na zakończenie zadania przed kontynuowaniem.
źródło
.Result
innego ?,httpContent.ReadAsStringAsync().Result
.Result
zablokowałoby wykonanie wątku w tej linii ... gdzie jakotxtBlock.Text.Wait()
bloki wywołania wait () ... więc masz rację, że w zasadzie nie ma różnicy. Ale podejrzewamtxtBlock.Text.Wait()
, że przyjąłby opcjonalny parametr całkowity, więc GUI nie zawiesza się, jeśli poprzednieReadAsStringAsync()
wywołanie nigdy nie powróci. Na przykład następująca blokada nietxtBlock.Text.Wait(1000)
Szybka odpowiedź, którą sugeruję, to:
response.Result.Content.ReadAsStringAsync().Result
źródło
Result
zadań. Ryzykujesz zablokowanie aplikacji. Zamiast tego użyj async / await.ReadAsStringAsync()
nie powrócisz, więc upewnij się, że nie wywołujesz tego w swoim GUI lub głównym wątku aplikacji.Myślę, że poniższy obraz pomaga tym, którzy muszą przyjść
T
jako typ zwrotu.źródło
Możesz użyć
GetStringAsync
metody:źródło