Http.Resilience
2.1.7
dotnet add package Http.Resilience --version 2.1.7
NuGet\Install-Package Http.Resilience -Version 2.1.7
<PackageReference Include="Http.Resilience" Version="2.1.7" />
<PackageVersion Include="Http.Resilience" Version="2.1.7" />
<PackageReference Include="Http.Resilience" />
paket add Http.Resilience --version 2.1.7
#r "nuget: Http.Resilience, 2.1.7"
#:package Http.Resilience@2.1.7
#addin nuget:?package=Http.Resilience&version=2.1.7
#tool nuget:?package=Http.Resilience&version=2.1.7
Http.Resilience
Http.Resilience adds fault tolerance to any HTTP request. It can be used together with C# HttpClient, WebRequest or any other HTTP client. Transient network failures are automatically catched and a configurable number of retries is issued.
Download and Install Http.Resilience
This library is available on NuGet: https://www.nuget.org/packages/Http.Resilience Use the following command to install Http.Resilience using NuGet package manager console:
PM> Install-Package Http.Resilience
You can use this library in any .NET Standard or .NET Core project.
API Usage
HttpRetryHelper provides easy-to-use Invoke and InvokeAsync methods which support configurable retry behavior - not only for the wellknown HttpClient but also for other http clients such as WebRequest or WebClient.
HttpRetryHelper is equipped with some good-practice retry logic but it also exposes configurability via HttpRetryOptions.
Recover from transient network failure
The following sample demonstrates a simple HTTP request using HttpClient. HttpRetryHelper is used to wrap httpClient.GetAsync(...). Whenever GetAsync(...) fails due to a transilient network failure, HttpRetryHelper attempts to recover the problem by repeatedly calling InvokeAsync.
var httpClient = new HttpClient();
var requestUri = "https://quotes.rest/qod?language=en";
var httpRetryHelper = new HttpRetryHelper(maxRetries: 3);
try
{
var httpResponseMessage = await httpRetryHelper.InvokeAsync(async () => await httpClient.GetAsync(requestUri));
var jsonContent = await httpResponseMessage.Content.ReadAsStringAsync();
Console.WriteLine($"{jsonContent}");
}
catch (Exception ex)
{
Console.WriteLine($"{ex.Message}");
}
Recover from unsuccessful HTTP status code
Retries can be configured using the RetryOnException delegate. If Invoke/Async throws an exception, we can intercept it with RetryOnException((ex) ⇒ ...) and return a bool value to indicate whether we want to retry the particular HTTP request (true=retry, false=do not retry).
var httpClient = new HttpClient();
var requestUri = "https://quotes.rest/qod?language=en";
var httpRetryOptions = new HttpRetryOptions();
httpRetryOptions.MaxRetries = 4;
var httpRetryHelper = new HttpRetryHelper(httpRetryOptions);
httpRetryHelper.RetryOnException<HttpRequestException>(ex => { return ex.StatusCode == HttpStatusCode.ServiceUnavailable; });
try
{
var httpResponseMessage = await httpRetryHelper.InvokeAsync(async () => await httpClient.GetAsync(requestUri));
var jsonContent = await httpResponseMessage.Content.ReadAsStringAsync();
Console.WriteLine($"{jsonContent}");
}
catch (Exception ex)
{
Console.WriteLine($"{ex.Message}");
}
Retry based on returned result
Retries can also be carried out if a particular result is returned by Invoke/InvokeAsync. RetryOnResult delegate allows to evaluate the returned result and indicate if a retry is necessary (true=retry, false=do not retry).
var httpClient = new HttpClient();
var requestUri = "https://yourapi/token/refresh";
var httpRetryOptions = new HttpRetryOptions();
httpRetryOptions.MaxRetries = 4;
var httpRetryHelper = new HttpRetryHelper(httpRetryOptions);
httpRetryHelper.RetryOnResult<RefreshTokenResult>(r => r.Error != "invalid_grant");
try
{
var refreshTokenResult = await httpRetryHelper.InvokeAsync(async () => await httpClient.PostAsync(requestUri, ...));
// ...
}
catch (Exception ex)
{
Console.WriteLine($"{ex.Message}");
}
License
This project is Copyright © 2023 Thomas Galliker. Free for non-commercial use. For commercial use please contact the author.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 is compatible. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- Microsoft.Extensions.Configuration.Abstractions (>= 6.0.0)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 6.0.0)
- Microsoft.Extensions.Logging.Abstractions (>= 6.0.0)
- Microsoft.Extensions.Options (>= 6.0.0)
- Microsoft.Extensions.Options.ConfigurationExtensions (>= 6.0.0)
-
.NETStandard 2.1
- Microsoft.Extensions.Configuration.Abstractions (>= 6.0.0)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 6.0.0)
- Microsoft.Extensions.Logging.Abstractions (>= 6.0.0)
- Microsoft.Extensions.Options (>= 6.0.0)
- Microsoft.Extensions.Options.ConfigurationExtensions (>= 6.0.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 2.1.7 | 4,859 | 1/7/2025 |
| 2.1.3-pre | 156 | 1/1/2025 |
| 2.1.2 | 267 | 12/2/2024 |
| 2.0.19-pre | 159 | 12/2/2024 |
| 2.0.18-pre | 176 | 11/5/2024 |
| 2.0.17-pre | 144 | 11/5/2024 |
| 2.0.15-pre | 159 | 10/24/2024 |
| 2.0.13 | 1,086 | 6/17/2024 |
| 2.0.12 | 2,869 | 3/29/2024 |
| 2.0.11-pre | 160 | 3/27/2024 |
| 2.0.10-pre | 157 | 3/11/2024 |
| 2.0.9 | 6,622 | 10/6/2023 |
| 2.0.8-pre | 215 | 10/3/2023 |
| 2.0.6-pre | 185 | 10/3/2023 |
| 2.0.4-pre | 209 | 9/23/2023 |
| 2.0.3-pre | 190 | 9/23/2023 |
| 2.0.0-pre | 199 | 9/23/2023 |
| 1.4.6 | 516 | 9/1/2023 |
| 1.4.4-pre | 191 | 9/1/2023 |
| 1.4.2 | 239 | 9/1/2023 |
2.1
- Add new retry policy for HttpResponseExceptions
2.0
- Integrate Microsoft.Extensions.Logging
- Integrate Microsoft.Extensions.DependencyInjection
- Integrate Microsoft.Extensions.Options
1.4
- Improve log messages
1.3
- Minimum .NET framework version is now 4.8
- Code cleanup
1.2
- Cleanups
1.1
- Support retry policies for Exceptions and HttpResponseMessages
- Add new retry handler RetryOnResult
- Code cleanup
1.0
- Initial release