知識マップ: HttpClientをusingで囲んではいけない ── C#業務アプリのHTTP通信実務(生成パターン・タイムアウト・リトライ)

記事「HttpClientをusingで囲んではいけない ── C#業務アプリのHTTP通信実務(生成パターン・タイムアウト・リトライ)」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。

C#のHttpClientはリクエストごとにusingで生成・破棄すると、閉じたソケットがTIME_WAIT状態でポートを占有し続けソケット枯渇を招き、逆にstaticのまま固定するとDNSを接続作成時にしか解決せず接続先の変更に追従できなくなる。公式の解決策は、SocketsHttpHandlerのPooledConnectionLifetimeで接続の寿命を区切るか、DIを使うならIHttpClientFactoryにハンドラーの管理を任せ、既定2分ごとに入れ替えて両方の問題を防ぐことである。ただしCookieContainerが意図せず共有される副作用があり、SocketsHttpHandlerが使えない.NET FrameworkではIHttpClientFactory導入かServicePoint.ConnectionLeaseTimeoutでの折衷策が必要になる。既定100秒のタイムアウトは接続先ごとに明示し、リトライは標準のresilienceハンドラーに任せつつ二重登録になり得るメソッドは無効化する。

C# HttpClientの正しい持ち方の知識マップHttpClientを毎回生成・破棄するとソケット枯渇を招き、staticのまま固定するとDNS変更に追従できなくなること、SocketsHttpHandlerのPooledConnectionLifetimeとIHttpClientFactoryがそれぞれ公式の解決策であること、タイムアウトとリトライの設計指針を示す図利用する原因になり得る利用する原因になり得る軽減する防止する防止するで構成できる両立しない推奨される対応防止するで構成できる利用する利用する原因になり得る利用するの後継原因になり得る前提とするHttpClientIHttpClientFactorySocketsHttpHandlerリクエストごとのHttpClient生成・破棄TCPのTIME-WAIT状態エフェメラルポート(動的ポート)ソケット枯渇static HttpClientのDNS変更への非追従PooledConnectionLifetime.NET FrameworkServicePoint.ConnectionLeaseTimeoutHttpClient.TimeoutプロパティCancellationToken(.NET)Microsoft.Extensions.Http.Resilience 標準ハンドラー安全でないHTTPメソッドの既定リトライによる二重実行リスクプロキシの自動検出WebClient/HttpWebRequest(レガシーHTTP API)CookieContainerの意図しない共有.NET(Core以降)

概念間の関係(全19件)

図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。

主要概念の定義

HttpClient
.NETでHTTP要求を送受信するためのクラスで、内部に接続プールを持ちアプリケーションの生存期間を通して再利用される前提で設計されている。
IHttpClientFactory
HttpClientの生成と、その裏側にあるハンドラー(接続プール)のプール管理・定期的な入れ替えをDIコンテナー経由で行う.NETの仕組み。
リクエストごとのHttpClient生成・破棄
リクエストのたびにnew HttpClient()を生成しusingで破棄する使い方で、ソケット枯渇を招きやすいアンチパターン。
TCPのTIME-WAIT状態
TCP接続を先に閉じた側のソケットが、遅延到着したパケットの混入を防ぐため2×MSL(Maximum Segment Lifetime)の間だけ保持し続ける状態。
PooledConnectionLifetime
SocketsHttpHandlerが持つ、プール内の接続を作り直すまでの寿命を指定するプロパティ。
SocketsHttpHandler
.NET Core 2.1以降でHttpClientの既定の内部実装として使われる、接続プールを管理するハンドラー。
ServicePoint.ConnectionLeaseTimeout
.NET Frameworkで、指定時間の経過後にリクエストを処理し終えた接続を閉じ、次回のリクエストで接続を作り直させる、ServicePointが持つプロパティ。
Microsoft.Extensions.Http.Resilience 標準ハンドラー
レートリミッター・全体タイムアウト・リトライ・サーキットブレーカー・試行タイムアウトを実績ある既定値のセットとして提供する、HttpClient向けの標準resilienceハンドラー。

機械可読データ

このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。