-
[C#] HttpClient 재시도, IHttpClientFactory와 표준 리질리언스 정책Microsoft .NET/C# 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는 멱등 키 없이 재시도하지 않는다
'Microsoft .NET > C#' 카테고리의 다른 글
[C#] DateTime vs DateTimeOffset, 서버 시간은 UTC로 관리하기 (0) 2026.11.10 [C#] async/await 데드락 원인과 ConfigureAwait 정리 (0) 2026.11.10 [C#] record 타입 정리, class와 차이와 with 식 (0) 2026.11.10 [C#] TaskCanceledException과 OperationCanceledException, HttpClient 타임아웃 구분 (0) 2026.11.10 [C#] string 타입 형식지정 (0) 2021.10.15