Microsoft .NET/C#
[C#] HttpClient 재시도, IHttpClientFactory와 표준 리질리언스 정책
전자기린
2026. 11. 10. 00:50

외부 API 호출이 가끔 실패할 때 재시도는 필수입니다. .NET 8에서는 Microsoft.Extensions.Http.Resilience로 표준화된 정책을 붙일 수 있습니다.
절차
- 패키지 설치
- IHttpClientFactory 등록
- 정책 세부 조정
- 직접 구현하는 경우
1. 패키지
dotnet add package Microsoft.Extensions.Http.Resilience2. 기본 등록
builder.Services.AddHttpClient("api", c =>
{
c.BaseAddress = new Uri("https://api.example.com");
c.Timeout = TimeSpan.FromSeconds(10);
})
.AddStandardResilienceHandler();AddStandardResilienceHandler()는 재시도·타임아웃·서킷브레이커·동시성 제한을 한 번에 붙입니다. 기본값은 지수 백오프 3회 재시도입니다.
3. 정책 세부 조정
.AddStandardResilienceHandler(o =>
{
o.Retry.MaxRetryAttempts = 2;
o.Retry.UseJitter = true;
o.Retry.ShouldHandle = args => ValueTask.FromResult(
args.Outcome.Result?.StatusCode is HttpStatusCode.RequestTimeout
or HttpStatusCode.TooManyRequests
or >= HttpStatusCode.InternalServerError);
});4. 직접 구현하는 경우
패키지 없이 짧게 감싸는 방법도 있습니다. 단, POST처럼 중복 실행이 위험한 요청에는 멱등 키를 꼭 붙입니다.
for (int i = 0; i < 3; i++)
{
try
{
return await client.GetStringAsync(url, ct);
}
catch (HttpRequestException) when (i < 2)
{
await Task.Delay(TimeSpan.FromMilliseconds(200 * Math.Pow(2, i)), ct);
}
}정리
- 재시도는
IHttpClientFactory등록에 붙여 한 곳에서 관리 - 4xx는 재시도하지 않는다 — 408·429·5xx만
- POST는 멱등 키 없이 재시도하지 않는다