@prefix schema: <https://schema.org/> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix ks: <https://comcomponent.com/vocab/> .

<https://comcomponent.com/blog/csharp-httpclient-practical-guide/#article>
    schema:about <https://comcomponent.com/knowledge/httpclient/>, <https://comcomponent.com/knowledge/ihttpclientfactory/> ;
    schema:mentions <https://comcomponent.com/knowledge/per-request-httpclient-disposal/>, <https://comcomponent.com/knowledge/tcp-time-wait/>, <https://comcomponent.com/knowledge/ephemeral-port/>, <https://comcomponent.com/knowledge/socket-exhaustion/>, <https://comcomponent.com/knowledge/socketshttphandler/>, <https://comcomponent.com/knowledge/pooled-connection-lifetime/>, <https://comcomponent.com/knowledge/dns-change-non-tracking/>, <https://comcomponent.com/knowledge/httpclient-timeout/>, <https://comcomponent.com/knowledge/http-resilience-handler/>, <https://comcomponent.com/knowledge/retry-unsafe-methods-risk/>, <https://comcomponent.com/knowledge/proxy-auto-detection/>, <https://comcomponent.com/knowledge/servicepoint-connectionleasetimeout/>, <https://comcomponent.com/knowledge/legacy-http-api/>, <https://comcomponent.com/knowledge/cookiecontainer-sharing-risk/>, <https://comcomponent.com/knowledge/dotnet-framework/>, <https://comcomponent.com/knowledge/dotnet/>, <https://comcomponent.com/knowledge/cancellationtoken-dotnet/> .

<https://comcomponent.com/knowledge/httpclient/> a skos:Concept ;
    skos:prefLabel "HttpClient"@ja ;
    skos:definition ".NETでHTTP要求を送受信するためのクラスで、内部に接続プールを持ちアプリケーションの生存期間を通して再利用される前提で設計されている。"@ja ;
    skos:altLabel "System.Net.Http.HttpClient" ;
    ks:uses <https://comcomponent.com/knowledge/socketshttphandler/> ;
    ks:configuredBy <https://comcomponent.com/knowledge/httpclient-timeout/> ;
    ks:uses <https://comcomponent.com/knowledge/cancellationtoken-dotnet/> ;
    ks:succeeds <https://comcomponent.com/knowledge/legacy-http-api/> .

<https://comcomponent.com/knowledge/ihttpclientfactory/> a skos:Concept ;
    skos:prefLabel "IHttpClientFactory"@ja ;
    skos:definition "HttpClientの生成と、その裏側にあるハンドラー(接続プール)のプール管理・定期的な入れ替えをDIコンテナー経由で行う.NETの仕組み。"@ja ;
    skos:altLabel "AddHttpClient" ;
    ks:mitigates <https://comcomponent.com/knowledge/socket-exhaustion/> ;
    ks:recommendedFor <https://comcomponent.com/knowledge/dotnet-framework/> .

<https://comcomponent.com/knowledge/socketshttphandler/> a skos:Concept ;
    skos:prefLabel "SocketsHttpHandler"@ja ;
    skos:definition ".NET Core 2.1以降でHttpClientの既定の内部実装として使われる、接続プールを管理するハンドラー。"@ja ;
    skos:broader <https://comcomponent.com/knowledge/httpclient/> ;
    ks:configuredBy <https://comcomponent.com/knowledge/pooled-connection-lifetime/> ;
    ks:incompatibleWith <https://comcomponent.com/knowledge/dotnet-framework/> ;
    ks:requires <https://comcomponent.com/knowledge/dotnet/> .

<https://comcomponent.com/knowledge/per-request-httpclient-disposal/> a skos:Concept ;
    skos:prefLabel "リクエストごとのHttpClient生成・破棄"@ja ;
    skos:definition "リクエストのたびにnew HttpClient()を生成しusingで破棄する使い方で、ソケット枯渇を招きやすいアンチパターン。"@ja ;
    skos:altLabel "using var client = new HttpClient()" ;
    skos:broader <https://comcomponent.com/knowledge/httpclient/> ;
    ks:mayCause <https://comcomponent.com/knowledge/tcp-time-wait/> .

<https://comcomponent.com/knowledge/tcp-time-wait/> a skos:Concept ;
    skos:prefLabel "TCPのTIME-WAIT状態"@ja ;
    skos:definition "TCP接続を先に閉じた側のソケットが、遅延到着したパケットの混入を防ぐため2×MSL(Maximum Segment Lifetime)の間だけ保持し続ける状態。"@ja ;
    skos:altLabel "TIME_WAIT" ;
    ks:uses <https://comcomponent.com/knowledge/ephemeral-port/> .

<https://comcomponent.com/knowledge/ephemeral-port/> a skos:Concept ;
    skos:prefLabel "エフェメラルポート(動的ポート)"@ja ;
    skos:definition "TCP接続でクライアント側が自動的に割り当てる送信元ポート番号で、Windowsの既定では49152〜65535の16384個がトランスポート・IPバージョンごとに用意される。"@ja ;
    skos:altLabel "dynamic port" ;
    skos:altLabel "動的ポート"@ja .

<https://comcomponent.com/knowledge/socket-exhaustion/> a skos:Concept ;
    skos:prefLabel "ソケット枯渇"@ja ;
    skos:definition "利用可能なエフェメラルポートを使い切り、新しいTCP接続を確立できなくなる状態。"@ja ;
    skos:altLabel "port exhaustion" ;
    skos:altLabel "TCP/IPポート枯渇"@ja .

<https://comcomponent.com/knowledge/dns-change-non-tracking/> a skos:Concept ;
    skos:prefLabel "static HttpClientのDNS変更への非追従"@ja ;
    skos:definition "HttpClientがDNSを接続作成時にしか解決しないため、接続がプール内で生き続ける限り接続先のIPアドレスが変わっても古いIPへつなぎ続ける問題。"@ja ;
    skos:altLabel "DNS staleness" .

<https://comcomponent.com/knowledge/pooled-connection-lifetime/> a skos:Concept ;
    skos:prefLabel "PooledConnectionLifetime"@ja ;
    skos:definition "SocketsHttpHandlerが持つ、プール内の接続を作り直すまでの寿命を指定するプロパティ。"@ja ;
    skos:broader <https://comcomponent.com/knowledge/socketshttphandler/> ;
    ks:prevents <https://comcomponent.com/knowledge/dns-change-non-tracking/> .

<https://comcomponent.com/knowledge/dotnet-framework/> a skos:Concept ;
    skos:prefLabel ".NET Framework"@ja ;
    skos:definition "Windowsのコンポーネントとして扱われ、インストールされているOSのライフサイクルに沿ってサポートされるランタイム。System.Messagingの対象範囲。"@ja .

<https://comcomponent.com/knowledge/servicepoint-connectionleasetimeout/> a skos:Concept ;
    skos:prefLabel "ServicePoint.ConnectionLeaseTimeout"@ja ;
    skos:definition ".NET Frameworkで、指定時間の経過後にリクエストを処理し終えた接続を閉じ、次回のリクエストで接続を作り直させる、ServicePointが持つプロパティ。"@ja .

<https://comcomponent.com/knowledge/httpclient-timeout/> a skos:Concept ;
    skos:prefLabel "HttpClient.Timeoutプロパティ"@ja ;
    skos:definition "HttpClientのリクエスト全体に対するタイムアウトを指定するプロパティで、既定値は100秒。"@ja ;
    skos:broader <https://comcomponent.com/knowledge/httpclient/> .

<https://comcomponent.com/knowledge/cancellationtoken-dotnet/> a skos:Concept ;
    skos:prefLabel "CancellationToken(.NET)"@ja ;
    skos:definition ".NETの協調的キャンセルの仕組み。非同期モードのハンドルへのファイルI/Oでは、内部的にCancelIoExの呼び出しに行き着く。"@ja ;
    skos:altLabel "CancellationToken" .

<https://comcomponent.com/knowledge/http-resilience-handler/> a skos:Concept ;
    skos:prefLabel "Microsoft.Extensions.Http.Resilience 標準ハンドラー"@ja ;
    skos:definition "レートリミッター・全体タイムアウト・リトライ・サーキットブレーカー・試行タイムアウトを実績ある既定値のセットとして提供する、HttpClient向けの標準resilienceハンドラー。"@ja ;
    skos:altLabel "AddStandardResilienceHandler" .

<https://comcomponent.com/knowledge/retry-unsafe-methods-risk/> a skos:Concept ;
    skos:prefLabel "安全でないHTTPメソッドの既定リトライによる二重実行リスク"@ja ;
    skos:definition "標準resilienceハンドラーが既定で全HTTPメソッドをリトライするため、POSTのような再実行すると二重登録になり得る操作までリトライされてしまうリスク。"@ja .

<https://comcomponent.com/knowledge/proxy-auto-detection/> a skos:Concept ;
    skos:prefLabel "プロキシの自動検出"@ja ;
    skos:definition "Windowsの既定設定でHttpClientがOSのプロキシ設定を自動検出しようとする動作で、最初の接続時に検出処理の時間がかかることがある。"@ja .

<https://comcomponent.com/knowledge/legacy-http-api/> a skos:Concept ;
    skos:prefLabel "WebClient/HttpWebRequest(レガシーHTTP API)"@ja ;
    skos:definition ".NET Frameworkの時代から存在し、互換性のために残されている古いHTTP通信APIで、新規開発ではHttpClientの使用が推奨されている。"@ja ;
    skos:altLabel "WebClient" ;
    skos:altLabel "HttpWebRequest" .

<https://comcomponent.com/knowledge/cookiecontainer-sharing-risk/> a skos:Concept ;
    skos:prefLabel "CookieContainerの意図しない共有"@ja ;
    skos:definition "IHttpClientFactoryがハンドラーをプールする結果、CookieContainerが複数のCreateClient呼び出し間で意図せず共有されてしまう副作用。"@ja .

<https://comcomponent.com/knowledge/dotnet/> a skos:Concept ;
    skos:prefLabel ".NET(Core以降)"@ja ;
    skos:definition ".NET Frameworkの後継となる、クロスプラットフォーム対応の.NETランタイム(.NET 5以降)。"@ja ;
    skos:altLabel ".NET Core" ;
    skos:altLabel "モダンな.NET"@ja .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/httpclient/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/socketshttphandler/> ;
    schema:description ".NET Core 2.1以降のHttpClientは、内部実装として既定でSocketsHttpHandlerを使う。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/fundamentals/networking/http/httpclient-guidelines> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/per-request-httpclient-disposal/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/tcp-time-wait/> ;
    schema:description "リクエストのたびに接続を閉じるため、閉じた側のソケットがTIME_WAIT状態でしばらく残り続ける。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/api/system.net.http.httpclient> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/tcp-time-wait/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/ephemeral-port/> ;
    schema:description "TIME_WAIT状態のソケットは、2×MSLの間、自分側のエフェメラルポートを占有し続ける。"@ja ;
    ks:evidence <https://www.rfc-editor.org/rfc/rfc9293.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/tcp-time-wait/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/socket-exhaustion/> ;
    schema:description "接続を閉じる速度が速いと、TIME_WAIT状態のソケットがエフェメラルポート(既定16384個)の枠を使い切り、ソケット枯渇に至り得る。"@ja ;
    ks:evidence <https://learn.microsoft.com/troubleshoot/windows-server/networking/default-dynamic-port-range-tcpip-chang>, <https://learn.microsoft.com/troubleshoot/windows-client/networking/tcp-ip-port-exhaustion-troubleshooting> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/ihttpclientfactory/> ;
    rdf:predicate ks:mitigates ;
    rdf:object <https://comcomponent.com/knowledge/socket-exhaustion/> ;
    schema:description "CreateClientのたびにクライアントは使い捨てでも、裏側のハンドラー(接続プールの実体)は共有され続けるため、リクエストごとにHttpClientを生成・破棄することによるソケット枯渇は起きない。ただし同時接続数そのものが多すぎる場合の枯渇まで防げるわけではない。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/core/extensions/httpclient-factory> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/ihttpclientfactory/> ;
    rdf:predicate ks:prevents ;
    rdf:object <https://comcomponent.com/knowledge/dns-change-non-tracking/> ;
    schema:description "CreateClientで都度クライアントを取得する使い方に限り、ハンドラーが既定2分ごとに入れ替わり、そのタイミングで接続が作り直されDNSが再解決されるためDNS変更に追従する。取得したクライアントをシングルトンとして保持し続けると入れ替えが働かず追従しない。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/core/extensions/httpclient-factory> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/pooled-connection-lifetime/> ;
    rdf:predicate ks:prevents ;
    rdf:object <https://comcomponent.com/knowledge/dns-change-non-tracking/> ;
    schema:description "寿命を迎えた接続は次のリクエスト時に作り直され、そのタイミングでDNSが再解決されるため、DNS変更に追従できる。公式ガイドラインが推奨する解決策。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/fundamentals/networking/http/httpclient-guidelines> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/socketshttphandler/> ;
    rdf:predicate ks:configuredBy ;
    rdf:object <https://comcomponent.com/knowledge/pooled-connection-lifetime/> ;
    schema:description "SocketsHttpHandlerはPooledConnectionLifetimeプロパティで接続の寿命を構成できる。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/fundamentals/networking/http/httpclient-guidelines> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/socketshttphandler/> ;
    rdf:predicate ks:incompatibleWith ;
    rdf:object <https://comcomponent.com/knowledge/dotnet-framework/> ;
    schema:description "SocketsHttpHandlerは.NET Core 2.1以降の実装であり、.NET Frameworkでは使えない。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/fundamentals/networking/http/httpclient-guidelines> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/ihttpclientfactory/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/dotnet-framework/> ;
    schema:description ".NET Frameworkでは、Microsoft.Extensions.Httpパッケージ経由でIHttpClientFactoryを導入することが公式に推奨されている。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/fundamentals/networking/http/httpclient-guidelines> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/servicepoint-connectionleasetimeout/> ;
    rdf:predicate ks:prevents ;
    rdf:object <https://comcomponent.com/knowledge/dns-change-non-tracking/> ;
    schema:description ".NET FrameworkでDI導入まで手が回らない場合の折衷策として、接続の寿命を区切りDNS変更に追従させられる。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/api/system.net.servicepoint.connectionleasetimeout> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/httpclient/> ;
    rdf:predicate ks:configuredBy ;
    rdf:object <https://comcomponent.com/knowledge/httpclient-timeout/> ;
    schema:description "HttpClientはTimeoutプロパティでリクエスト全体のタイムアウト(既定100秒)を設定できる。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/api/system.net.http.httpclient.timeout> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/httpclient/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/cancellationtoken-dotnet/> ;
    schema:description "特定のリクエストだけ短く/長くタイムアウトさせたい場合は、CancellationTokenSourceが発行するトークンをGetAsync等に渡す。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/api/system.net.http.httpclient> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/ihttpclientfactory/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/http-resilience-handler/> ;
    schema:description "AddHttpClientが返すビルダーにAddStandardResilienceHandlerを明示的に追加した場合、リトライ・サーキットブレーカー・タイムアウトの標準セットを導入できる。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/core/resilience/http-resilience> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/http-resilience-handler/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/retry-unsafe-methods-risk/> ;
    schema:description "標準ハンドラーは既定ですべてのHTTPメソッドをリトライするため、POSTのような再実行で二重登録になり得る操作でも無条件に再送され得る。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/core/resilience/http-resilience> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/httpclient/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/proxy-auto-detection/> ;
    schema:description "Windows上でプロキシ設定を明示していない場合、HttpClientはOSのプロキシ設定(自動検出を含む)を使うため、最初の接続時に検出処理の時間がかかることがある。HttpClientHandlerでUseProxyをfalseにするか、Proxyを明示すれば自動検出は介さない。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/api/system.net.http.httpclient> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/httpclient/> ;
    rdf:predicate ks:succeeds ;
    rdf:object <https://comcomponent.com/knowledge/legacy-http-api/> ;
    schema:description "HttpClientは互換性のために残されているWebClientとHttpWebRequestの後継で、新規開発ではHttpClientの使用が推奨される。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/api/system.net.webclient> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/ihttpclientfactory/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/cookiecontainer-sharing-risk/> ;
    schema:description "ハンドラーがプールされる結果、CookieContainerが複数のCreateClient呼び出し間で意図せず共有される。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/fundamentals/networking/http/httpclient-guidelines> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/socketshttphandler/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/dotnet/> ;
    schema:description "SocketsHttpHandlerは.NET Core 2.1以降で導入された実装であり、.NET(Core以降)であることを前提とする。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/fundamentals/networking/http/httpclient-guidelines> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .
