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

C# HttpRequestException の見方(ステータス・内側例外)

HttpRequestException は HTTP 呼び出し全般の失敗を包むことが多い。ネットワーク失敗も、状況によってはステータス付きも、内側に別例外がある。

先に結論

  • まず InnerException(Socket / IO / SSL)を見る
  • .NET 5+ では StatusCode が付くことがある。付いていれば HTTP 層の失敗
  • EnsureSuccessStatusCode 由来なら 4xx/5xx が原因
  • タイムアウトは TaskCanceledException 側になることも多い(混同注意)

切り分けチェックリスト

  1. メッセージと InnerException の型を控える
  2. StatusCode があるか(401/403/404/500 など)
  3. DNS・証明書・接続拒否ならネットワーク / 環境
  4. 応答本文(ProblemDetails 等)をログ(秘密情報に注意)
  5. 再現が負荷時だけなら枯渇・相手側制限を疑う

コード上の定石

using var res = await http.GetAsync(url, ct);
if (!res.IsSuccessStatusCode)
{
    var body = await res.Content.ReadAsStringAsync(ct);
    // StatusCode + body をログしてから例外化
    res.EnsureSuccessStatusCode();
}

よくある原因

  • URL・環境変数の向き先ミス
  • 認証ヘッダ不足(401/403)
  • TLS / 証明書(社内プロキシ)
  • 相手側 5xx・メンテ
  • ソケット枯渇(都度 new HttpClient)

関連: HttpClient ソケット枯渇

ざっくりまとめ

  • Inner と StatusCode を先に見る
  • ネットワーク失敗と HTTP エラーを分ける
  • ログにステータスと本文要約を残す

関連記事