HttpRequestException は HTTP 呼び出し全般の失敗を包むことが多い。ネットワーク失敗も、状況によってはステータス付きも、内側に別例外がある。
先に結論
- まず InnerException(Socket / IO / SSL)を見る
- .NET 5+ では
StatusCode が付くことがある。付いていれば HTTP 層の失敗
EnsureSuccessStatusCode 由来なら 4xx/5xx が原因
- タイムアウトは
TaskCanceledException 側になることも多い(混同注意)
切り分けチェックリスト
- メッセージと InnerException の型を控える
- StatusCode があるか(401/403/404/500 など)
- DNS・証明書・接続拒否ならネットワーク / 環境
- 応答本文(ProblemDetails 等)をログ(秘密情報に注意)
- 再現が負荷時だけなら枯渇・相手側制限を疑う
コード上の定石
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 エラーを分ける
- ログにステータスと本文要約を残す
関連記事