HttpClient で外部 API を叩いていると、「たまに固まる」「タイムアウトで落ちる」が起きやすい。設定箇所が複数あるので、逆引きできるように整理する。
この記事では、どこにタイムアウトがあるかと現場での決め方をざっくりまとめる。
よく触るタイムアウトは次の3つ。
HttpClient.Timeout:リクエスト全体の上限(デフォルト 100 秒)CancellationToken:呼び出し側で打ち切るまずは HttpClient.Timeout と CancellationToken を押さえると実務の大半はカバーできる。
using var client = new HttpClient
{
Timeout = TimeSpan.FromSeconds(30)
};
var response = await client.GetAsync("https://example.com/api");
この値を超えると TaskCanceledException(内側にタイムアウト起因)になりやすい。メッセージだけ見るとキャンセルに見えて紛らわしい。
// Program.cs
builder.Services.AddHttpClient("external-api", client =>
{
client.BaseAddress = new Uri("https://example.com/");
client.Timeout = TimeSpan.FromSeconds(15);
});
public class ApiService(IHttpClientFactory factory)
{
public async Task<string> GetAsync()
{
var client = factory.CreateClient("external-api");
return await client.GetStringAsync("/data");
}
}
new HttpClient() の連発はソケット枯渇の原因になる。ASP.NET Core なら Factory 経由が基本。
using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5));
var response = await client.GetAsync(url, cts.Token);
「この画面操作は 5 秒で諦めたい」など、呼び出し単位の制御に向く。HttpClient.Timeout より細かく止められる。
TaskCanceledException で、原因がタイムアウトか本当のキャンセルか分からないTimeout / CancellationToken を確認HttpClient.TimeoutCancellationTokenIHttpClientFactory を使う