こんにちは、サイオステクノロジー技術部の武井です。
※本記事の英語版はこちら(Click here to read in English)
マイクロソフト公式の以下のドキュメントにHttpClientクラスの挙動について書かれていました。
https://docs.microsoft.com/en-us/dotnet/api/system.net.https.httpsclient
どうやら、接続の都度、HttpClientのインスタンスを生成するのではなく、クラスのStaticな変数に持たせて使いまわせということらしいです。これをちょっと試してみました。
以下のコードを実行してみました。10個のスレッドを立ち上げて、特定のURLのページを取得するという単純なものです。都度、HttpClientのインスタンスを取得しています。
この通信をWireSharkでキャプチャしてみました。該当のサーバーへの通信の中で、TCPのSYNフラグのみが立っているものと、HTTPレスポンスのステータスコードが200のものを抽出しました。確かに接続の都度、TCPコネクションを確立しているようです。
次に以下のコードを実行してみました。マイクロソフト公式ドキュメント通り、HttpClientのインスタンスをStaticでreadonlyにしてみました。
WireSharkでのキャプチャ結果は以下のようになりました。TCPコネクションは2つしか張ってませんが、HTTPレスポンスはきちんと10個あり、しかもそれらのTCPのソースポートは、最初に張った2つのTCPのソースポート(54672と54673)しかないようです。TCPコネクションを使いまわしているように見えます。