• システム開発に関わる内容をざっくりと書いていく

C# IHttpClientFactory の基本とタイムアウト設定

IHttpClientFactory は HttpClient の寿命・ハンドラ再利用を枠組みで管理する仕組み。都度 new によるソケット枯渇を避けつつ、名前付きクライアントで Timeout などを揃える。

先に結論

  • DI で AddHttpClient → 注入して使うのが基本
  • Timeout はクライアント単位で明示(既定 100 秒に頼らない)
  • 名前付き/型付きクライアントで宛先ごとの設定を分ける
  • キャンセルは CancellationToken も併用

最小の登録例

builder.Services.AddHttpClient("orders", c =>
{
    c.BaseAddress = new Uri("https://api.example.com/");
    c.Timeout = TimeSpan.FromSeconds(15);
});

// 利用側
var http = _factory.CreateClient("orders");
using var res = await http.GetAsync("v1/items", ct);

タイムアウトのポイント

  • HttpClient.Timeout はリクエスト全体の上限
  • ポリシー(Polly 等)のタイムアウトと二重定義に注意
  • 切れ方は TaskCanceledException になりやすい
  • 接続失敗は内側に SocketException が付くことが多い

よくある落とし穴

  • Factory を使いつつ、別経路で new HttpClient() が残っている
  • Timeout を無限(Timeout.InfiniteTimeSpan)にして放置
  • ハンドラに付けたタイムアウトとクライアント Timeout の混乱
  • BaseAddress と相対パスの結合ミス

関連: HttpClient タイムアウト / ソケット枯渇

ざっくりまとめ

  • AddHttpClient で寿命と設定を集約
  • Timeout は宛先ごとに明示
  • キャンセルと例外型(Canceled / Socket)をセットで見る

関連記事