HttpResponseMessageからコンテンツ/メッセージを取得する


175

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
}

回答:


66

GetResponse()を呼び出す必要があります。

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

33
ありがとう、でもここでこのエラーが発生する理由:「System.Net.Http.HttpResponseMessage」には、「GetResponseStream」の定義が含まれておらず、タイプ「System.Net.Http.HttpResponseMessage」の最初の引数を受け入れる拡張メソッド「GetResponseStream」もありません。が見つかりました」
クレム

13
@Klemzy-あなたはそれを非同期的に呼んでいるからです。Content代わりにプロパティを使用してみてください。こちら例をご覧ください。2番目のステップまでスクロールします。
Icemanind 2013

2
@Klemzy- ここ例を見てください。2番目のステップまでスクロールします。あなたがそれを理解できない場合、私は私の答えを編集して、あなたのために例を挙げます
Icemanind

17
この回答は完全に主題外であり、OPは/ HttpClientではなくを使用しています。HttpWebRequestHttpWebResponse
Maxime Rossini

1
質問はHttpCientに関するものであり、あなたの応答は時代遅れで時代遅れのHttpWebRequestに基づいています。
Payam

370

最後の行を次のように変更するのが最も簡単なアプローチだと思います

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

この方法では、ストリームリーダーを導入する必要はなく、拡張メソッドも必要ありません。


5
特にこれがコンテンツをオブジェクトに簡単にシリアル化する機能を提供するため、これがなぜ受け入れられた答えではないのか分かりません。
Jason McKindly

3
ReadAsStringAsyncはIMHOのエラーを適切に処理しません。
stannius

16
awaitを使用する代わりに、Response.Content.ReadAsStringAsync()。Resultを使用することもできます
Justin

8
ただし注意してください:応答に絵文字やその他のUnicode文字がある場合、ReadAsStringAsync()はスローする可能性があります。私はそれを克服するために(受け入れられた答えのように)ストリームを使わなければなりませんでした。
イチョウ

41

これを試してください、あなたはこのような拡張メソッドを作成することができます:

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

次に、拡張メソッドを呼び出すだけです。

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

これがお役に立てば幸いです;-)


起動して実行するのがはるかに簡単
Aage

使用してくださいawait代わりに.Result...またはあなたのコードは、非同期プログラミングを扱うことができない場合は、代わりに同期HTTPクライアントを使用します。しかし、最近のコードはすべてそうするべきです。そうでなければ、アプリケーションが何か間違っていることを示している可能性があります。
Maxime Rossini

9

特定のタイプにキャストする場合(テスト内など)、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>();

2
オブジェクトyourTypeInstance = await response.Content.ReadAsAsync(typeof(YourType)); var yourTypeInstance = await response.Content.ReadAsAsync <YourType>();である必要があります。
Thomas.Benz 2017年

Request.Content.ReadAsAsyncを使用してJsonを解析し、恐ろしいパフォーマンスを得ました。
W.Leto 2018

4

rudivonstadenの答えによって

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

メソッドを非同期にしたくない場合は、使用できます

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

Wait()は重要です。非同期操作を行っているため、先に進む前にタスクが完了するのを待つ必要があるためです。


3
別のものを使用し.Resultていますか?httpContent.ReadAsStringAsync().Result
mkb

.Resultその行のスレッドの実行をtxtBlock.Text.Wait()ブロックします... wait()呼び出しのブロックとして...したがって、基本的に違いはないことは正しいです。しかしtxtBlock.Text.Wait()、オプションの整数パラメーターを受け取るので、前のReadAsStringAsync()呼び出しが戻らない場合でもGUIがハングしないと思います。たとえば、次の例では1秒以内にブロックされますtxtBlock.Text.Wait(1000)
benhorgen

3

私が提案する簡単な答えは:

response.Result.Content.ReadAsStringAsync().Result


Resultタスクを呼び出さないでください。アプリケーションをロックするリスクがあります。代わりにasync / awaitを使用してください。
eltiare

絶対に言ったことはありません...早くて汚いことはそれを成し遂げることがあります。しかし、私はあなたがReadAsStringAsync()戻ってこないというリスクを負うことに同意するので、GUIまたはメインアプリケーションスレッドで呼び出さないようにしてください。
ベンホルゲン

1

次の画像はT、戻り値の型として取得する必要がある人に役立つと思います。

ここに画像の説明を入力してください


0

次のGetStringAsync方法を使用できます。

var uri = new Uri("http://yoururlhere");
var response = await client.GetStringAsync(uri);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.