Back to articles
.NET & C#
Mar 15, 2026•5 min read

Building Resilient REST APIs with ASP.NET Core: Circuit Breakers, Retries, and Idempotency

A deep dive into engineering production-grade REST APIs in .NET that withstand transient network failures, enforce idempotency, and degrade gracefully under load.

Paras Maharjan
Paras MaharjanSenior Software Engineer

In distributed enterprise architectures, services must be designed under the assumption that networks are unreliable, downstream dependencies will experience latency spikes, and transient failures are inevitable.

Over the course of building high-throughput backend services in C# and .NET, I have found that incorporating resilience patterns from day one prevents cascading failures and maintains system availability.

1. Transient Fault Handling with Polly

When making outbound HTTP calls to third-party providers or internal microservices, naive HttpClient calls without retry or circuit-breaker policies can easily exhaust connection pools.

csharp
builder.Services.AddHttpClient<IExternalBillingService, ExternalBillingService>()
    .AddStandardResilienceHandler(options =>
    {
        options.Retry.MaxRetryAttempts = 3;
        options.Retry.BackoffType = DelayBackoffType.Exponential;
        options.Retry.UseJitter = true;
        options.CircuitBreaker.SamplingDuration = TimeSpan.FromSeconds(30);
        options.CircuitBreaker.FailureRatio = 0.5;
    });

2. Idempotent Mutations

In mobile banking and financial transactions, network timeouts during POST operations can cause duplicate charge requests. Implementing an Idempotency-Key filter at the API gateway layer protects consumers against double charging.

csharp
[HttpPost("transfers")]
[RequireIdempotencyKey]
public async Task<IActionResult> ExecuteTransfer([FromBody] TransferRequest request, CancellationToken ct)
{
    var result = await _transferService.ProcessTransferAsync(request, ct);
    return Ok(result);
}

Summary

Resilience is not merely adding try/catch blocks—it requires understanding failure modes, configuring appropriate timeouts, and propagating CancellationToken throughout asynchronous pipelines.