0

RESTful サービスへの一括アップロードを行う .NET コンソール アプリケーションがあります。HttpClientサービスとの通信に使用しています。デフォルトでは、 はHttpClientを使用しHttpWebRequestて接続を確立します。私は一度に 1 つの接続を行っています。4000 件近くのリクエストにヒットすると、リクエストが失敗し始め、それを説明するエラーが発生します -

..システムに十分なバッファ スペースがないか、キューがいっぱいでした。

これは、4000 件のリクエストを行う直前に XP がエフェメラル ポートを使い果たしたためだと思います。

アプリの実行中に netstat を見ると、サービスへの約 300 の接続が「確立済み」であることがわかります。一度に 1 つの接続しか作成していません。接続は最終的に明らかに閉じられていますが、これらの接続がより早く閉じられるようにするために何かをする必要がありますか?

アクティブな接続を見ると、リクエストごとに新しいエフェメラル ポートが使用されていることがわかります。エラーを回避するためにHttpClient.PostAsync()、同じエフェメラル ポートを再利用する方法はありますか? これほど多くのリクエストを行う正しい方法は何ですか?

一度に 1 つの接続のみを作成するときに使用している理由HttpClient.PostAsync()は、これを 2 または 3 に増やすつもりだからです。この問題を解決している間、接続を 1 に減らしました。

編集: Windows レジストリのエフェメラル ポートの範囲を拡大することでこの問題を解決できましたが、将来的にリクエストの数が劇的に増加する可能性があるため、コード ベースのソリューションを見つけたいと考えています。

4

0 に答える 0