2012-12-30 4 views
6

System.Net.Http.HttpClientを使用して、一連の要求をコンソールアプリケーションからREST APIに送信し、JSON応答を強く型付けされたオブジェクトに逆シリアル化します。私は要求がフィドラー経由でルーティングされたときに、すべてが正常に動作することによりthis question、で説明したものと非常に類似した問題が発生しています、しかし.NET HttpClientがいくつかの要求の後でハングします(Fiddlerがアクティブでない限り)

using (var client = new HttpClient()) 
{ 
    var content = new StringContent(data, Encoding.UTF8, "text/html"); 
    var response = client.PostAsync(url, content).Result; 

    response.EnsureSuccessStatusCode(); 

    return response.Content.ReadAsAsync<MyClass>().Result; 
} 

が、それは第四または第五リクエストの後にハングアップ:私の実装では、このようなものですフィドラーは無効です。

問題の原因が同じ場合は、要求ごとにリソースを完全に解放するためにHttpClientで何かを行う必要があると思われますが、これを行う方法を示すコードサンプルは見つかりません。

誰かが私を正しい方向に向けることができます。

多くのおかげで、あなたはHttpResponseMessageオブジェクトを廃棄されていません

ティム

答えて

8

。これにより、サーバーでオープンストリームを残すことができ、個々のサーバーのストリームのクォータがいっぱいになると、これ以上の要求は送信されません。

using (var client = new HttpClient()) 
{ 
    var content = new StringContent(data, Encoding.UTF8, "text/html"); 
    using(var response = client.PostAsync(url, content).Result) 
    {  
     response.EnsureSuccessStatusCode(); 
     return response.Content.ReadAsAsync<MyClass>().Result; 
    } 
} 
+0

ありがとうAndrew - それは命を救う人でした。実際、HttpWebRequestを使用するときにこの問題が発生していましたが、その解決策は同じでしたが、HttpClientコードパターンでこれを行う方法はすぐには分かりませんでした。再度、感謝します。 –

+0

ここに何か他のことがあります。ここでの唯一のストリームは、応答メッセージのContentプロパティに割り当てられたStreamContentオブジェクトに渡されるNetworkStreamです。このようにHttpClientを使用すると、応答本体が自動的にバッファリングされ、検索できないストリームはバッファされると自動的に破棄されます。 HttpCompletionOption.ResponseContentReadを使用してHttpClientによって取得されたHttpResponseMessageを処分する必要はありません。 –

関連する問題