it-swarm.com.ru

Получение контента / сообщения от HttpResponseMessage

Я пытаюсь получить содержимое 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
}
138
Clem

Вам нужно позвонить GetResponse () .

Stream receiveStream = response.GetResponseStream ();
StreamReader readStream = new StreamReader (receiveStream, Encoding.UTF8);
txtBlock.Text = readStream.ReadToEnd();
58
Icemanind

Я думаю, что самый простой подход - это просто изменить последнюю строку на

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

Таким образом, вам не нужно вводить потоковые программы чтения и вам не нужны никакие методы расширения.

298
rudivonstaden

Попробуйте это, вы можете создать метод расширения следующим образом:

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

а затем просто вызовите метод расширения:

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

Я надеюсь, что это поможет вам ;-)

33
MCurbelo

Если вы хотите привести его к определенному типу (например, в тестах), вы можете использовать ReadAsAsync метод расширения:

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

или следующий для синхронного кода:

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

Обновление: есть также общая опция ReadAsAsync <> , которая возвращает экземпляр определенного типа вместо объекта, объявленного объектом:

YourType yourTypeInstance = await response.Content.ReadAsAsync<YourType>();
7
taras-mytofir

К ответу из Рудивонстадена

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

но если вы не хотите делать метод асинхронным, вы можете использовать

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

Wait () это важно, потому что мы выполняем асинхронные операции, и мы должны дождаться завершения задачи, прежде чем идти дальше.

1
Stanimir Petrov

Вы можете использовать метод GetStringAsync:

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