Я пытаюсь получить содержимое HttpResponseMessage. Должно быть:, {"message":"Action '' does not exist!","success":false}
но я не знаю, как получить его из HttpResponseMessage.
HttpClient httpClient = new HttpClient();
HttpResponseMessage response = await httpClient.GetAsync("http://****?action=");
txtBlock.Text = Convert.ToString(response); //wrong!
В этом случае txtBlock будет иметь значение:
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
вместо этого использовать свойство. Посмотрите на пример здесь . Прокрутите вниз до второго шага.HttpClient
, а неHttpWebRequest
/HttpWebResponse
.Я думаю, что самый простой подход - это просто изменить последнюю строку на
Таким образом, вам не нужно вводить потоковые ридеры и вам не нужны никакие методы расширения.
источник
Попробуйте это, вы можете создать метод расширения следующим образом:
а затем просто вызовите метод расширения:
Я надеюсь, что это поможет вам ;-)
источник
await
вместо.Result
... или используйте синхронный HTTP-клиент, если ваш код не может справиться с асинхронным программированием. Но любой современный код должен, в противном случае это может быть признаком того, что ваше приложение делает что-то не так.Если вы хотите привести его к определенному типу (например, в тестах), вы можете использовать метод расширения ReadAsAsync :
или следующий для синхронного кода:
Обновление: есть также универсальная опция ReadAsAsync <>, которая возвращает экземпляр определенного типа вместо объявленного объектом:
источник
К ответу из Рудивонстадена
но если вы не хотите делать метод асинхронным, вы можете использовать
Wait () это важно, потому что мы выполняем асинхронные операции, и мы должны дождаться завершения задачи, прежде чем идти дальше.
источник
.Result
то другое ?,httpContent.ReadAsStringAsync().Result
.Result
будет блокировать выполнение потока в этой строке ... где, какtxtBlock.Text.Wait()
блокирует вызов wait () ... так что вы правы, что в принципе нет никакой разницы. Но я подозреваю,txtBlock.Text.Wait()
что примет необязательный целочисленный параметр, чтобы GUI не зависал, если предыдущийReadAsStringAsync()
вызов никогда не вернется. Например, следующее будет блокироваться не более чем на 1 секундуtxtBlock.Text.Wait(1000)
Быстрый ответ, который я предлагаю:
response.Result.Content.ReadAsStringAsync().Result
источник
Result
на задачи. Вы рискуете заблокировать свое приложение. Вместо этого используйте async / await.ReadAsStringAsync()
не вернуться, поэтому не вызывайте его в своем графическом интерфейсе или в главном потоке приложений.Я думаю, что следующее изображение помогает тем, кому нужно вернуться в
T
качестве типа возврата.источник
Вы можете использовать
GetStringAsync
метод:источник