Http.Resilience
2.0.13
See the version list below for details.
dotnet add package Http.Resilience --version 2.0.13
NuGet\Install-Package Http.Resilience -Version 2.0.13
<PackageReference Include="Http.Resilience" Version="2.0.13" />
paket add Http.Resilience --version 2.0.13
#r "nuget: Http.Resilience, 2.0.13"
// Install Http.Resilience as a Cake Addin #addin nuget:?package=Http.Resilience&version=2.0.13 // Install Http.Resilience as a Cake Tool #tool nuget:?package=Http.Resilience&version=2.0.13
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. |
.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.0.15-pre | 65 | 10/24/2024 |
2.0.13 | 330 | 6/17/2024 |
2.0.12 | 828 | 3/29/2024 |
2.0.11-pre | 87 | 3/27/2024 |
2.0.10-pre | 90 | 3/11/2024 |
2.0.9 | 5,200 | 10/6/2023 |
2.0.8-pre | 126 | 10/3/2023 |
2.0.6-pre | 110 | 10/3/2023 |
2.0.4-pre | 132 | 9/23/2023 |
2.0.3-pre | 110 | 9/23/2023 |
2.0.0-pre | 111 | 9/23/2023 |
1.4.6 | 377 | 9/1/2023 |
1.4.4-pre | 113 | 9/1/2023 |
1.4.2 | 139 | 9/1/2023 |
1.4.1-pre | 117 | 9/1/2023 |
1.4.0-pre | 121 | 8/31/2023 |
1.3.13-pre | 124 | 8/31/2023 |
1.3.12-pre | 122 | 8/31/2023 |
1.3.11-pre | 113 | 8/31/2023 |
1.3.10 | 194 | 6/20/2023 |
1.3.8-pre | 127 | 6/20/2023 |
1.3.2-pre | 168 | 12/31/2022 |
1.3.1-pre | 164 | 12/12/2022 |
1.3.0-pre | 154 | 12/12/2022 |
1.2.13 | 427 | 12/9/2022 |
1.2.12-pre | 160 | 12/9/2022 |
1.2.11 | 326 | 11/24/2022 |
1.2.9-pre | 169 | 11/24/2022 |
1.2.7-pre | 163 | 11/24/2022 |
1.1.34 | 14,288 | 6/17/2022 |
1.1.33-pre | 185 | 6/17/2022 |
1.1.31-pre | 170 | 6/17/2022 |
1.1.28-pre | 203 | 5/5/2022 |
1.1.27-pre | 182 | 4/27/2022 |
1.1.26-pre | 177 | 4/26/2022 |
1.1.25 | 437 | 4/26/2022 |
1.1.23-pre | 188 | 4/26/2022 |
1.1.18-pre | 193 | 4/26/2022 |
1.1.14-pre | 184 | 4/25/2022 |
1.1.10-pre | 206 | 4/21/2022 |
1.1.4-pre | 184 | 4/21/2022 |
1.1.0-pre | 194 | 4/21/2022 |
1.0.36 | 413 | 4/21/2022 |
1.0.31-pre | 212 | 1/9/2022 |
1.0.29-pre | 189 | 12/26/2021 |
1.0.28 | 295 | 12/21/2021 |
1.0.26-pre | 195 | 12/21/2021 |
1.0.25 | 283 | 12/18/2021 |
1.0.23-pre | 220 | 12/18/2021 |
1.0.15-pre | 207 | 12/13/2021 |
1.0.6-pre | 214 | 12/9/2021 |
1.0.4-pre | 189 | 12/9/2021 |
1.0.2-pre | 228 | 12/8/2021 |
1.0.0-pre | 202 | 12/8/2021 |
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