web-dev-qa-db-ja.com

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

Rudivonstadenの回答で

`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