2016-08-25 11 views
1

私はHTTPリクエストのリクエスト本体がデバッグのために何を含んでいるのかを見たいと思っています。ここに私が今持っているものがあります:HttpClientの使用方法リクエストコンテンツの本文を表示するにはどうすればよいですか?

var httpResponseMessage = await _httpClient.PostAsync(uri, objectToInsert, jsonFormatter); 

//This throws an exception 
var thisDoesntWork = await httpResponseMessage.RequestMessage.Content.ReadAsStringAsync(); 

これはObjectDisposedExceptionをスローします。 JSONが送信されていることを確認するためにリクエスト本体を表示するにはどうすればよいですか?

+5

[フィドラー](http://www.telerik.com/fiddler)を使用しますか? – rene

+0

@rene - 私はFiddlerやWiresharkや他の多くのツールを使うことができますが、これは一度だけの好奇心の質問ではありません。私は監査目的のために要求本体を記録したいので、プログラムで要求本体を判断する必要があります。 –

+0

@JustinHelgersonその後、[FiddlerCore](http://www.telerik.com/fiddler/fiddlercore)を使用してください:) –

答えて

1

短い答えは、あなたがリクエストがすでにに送信されていないことができた後です。 HttpClientは、要求が開発者の便宜のために行われた後、コンテンツ本体を破棄します。詳細については、Why do HttpClient.PostAsync and PutAsync dispose the content?を参照してください。

代わりに、既存のHttpContent実装を継承し、Disposeメソッドをオーバーライドし、廃棄する前にコンテンツの本体を記録することができます。

または、示唆したように、外部ツールを使用して飛行中のリクエストを監視してください。

-2

Content.ReadAsStringAsync()が終了する前にHttpRequestMessageとHttpClientを破棄しているため、ObjectDisposedExceptionがスローされます。

注意Content.ReadAsStringAsync()は非同期メソッドです。 HttpClientを廃棄する前に、完了するまで待つ必要があります。

あなたが同期的に実行するコードを強制的に.Resultを追加することができます非同期(async)を使用したいされていない場合は、次の

var response = httpClient.PostAsync(BaseUri, new FormUrlEncodedContent(parameters)).Result; 

var contents = response.Content.ReadAsStringAsync().Result; 
+0

私はずっと後で 'HttpClient'を処分しません。明らかに 'PostAsync'は自動的に' HttpRequestMessage'を何らかの方法で破棄しています。私はその質問をしています。また、あなたが私の質問を見ても、私は既に 'ReadAsStringAsync'メソッドを待っています。 –

+0

これを試して、私からの応答を教えてください: httpResponseMessage.EnsureSuccessStatusCode(); HTTP応答のIsSuccessStatusCodeプロパティがfalseの場合、例外がスローされます。 –

+0

あなたができることは、テストする文字列としてjsonを送ることです。 .... PostAsync(uri、new StringContent(data)); –

関連する問題