Neu in .NET 8.0 [25]: Resilienz im HTTP-Client
.NET 8.0 enthält die etablierte Bibliothek Polly für Ausfallsicherheit und den Umgang mit temporären Fehlersituationen.
- Dr. Holger Schwichtenberg
Microsoft hat die etablierte .NET-Bibliothek Polly für Ausfallsicherheit und den Umgang mit temporären Fehlersituationen in .NET 8.0 integriert. Dazu gibt seit .NET 8.0 die neue NuGet-Pakete Microsoft.Extensions.Resilience
und Microsoft.Extensions.Http.Resilience
.
Die Verwendung in Verbindung mit einem WebAPI-Aufruf ist einfach: Man verwendet AddStandardResilienceHandler()
beim Injizieren einer HttpClient
-Instanz.
// Erzeuge einen Service Builder
IServiceCollection services = new ServiceCollection();
// Ergänze HTTP Client für Wetterdienst
// NEU in .NET 8.0:
.AddStandardResilienceHandler(); // basiert auf Polly !
services.AddHttpClient<WeatherServiceClient>().AddStandardResilienceHandler();
IServiceProvider serviceProvider = services.BuildServiceProvider();
for (int i = 0; i < 10000; i++)
{
var client = serviceProvider.GetService<WeatherServiceClient>();
try
{
var daten = client.GetWeather();
#region Ausgabe der Wetterdaten
foreach (var item in daten.Result)
{
Console.WriteLine(item.Date + " " +
item.TemperatureC + " " + item.Summary);
}
#endregion
System.Threading.Thread.Sleep(500);
}
catch (Exception ex)
{
CUI.Error(DateTime.Now + ": " + ex.Message);
}
}
Hinweis: Die Strategien des Standard-Handlers lassen sich per Programmcode oder per Anwendungskonfigurationsdatei appsettings.json
anpassen. Die Dokumentation dazu finden Sie nicht bei Microsoft, sondern bei Polly. Die bei dem Standardhandler geltenden Standardeinstellungen findet man dabei jeweils bei den einzelnen Strategien, beispielsweise sieht man, dass ein Aufruf maximal dreimal versucht wird mit einer konstanten Verzögerung von zwei Sekunden.
Durch Ăśbergabe einer Funktion, die ein Objekt vom Typ HttpStandardResilienceOptions
liefert, kann man die Polly-Pipeline umkonfigurieren. Das nächste Beispiel zeigt: Der Aufruf wird bis zu fünf Mal wiederholt. Der Abstand zwischen den Versuchen ist konstant eine Sekunde. Bei dem Versuch gibt es eine Bildschirmausgabe.
services.AddHttpClient<WeatherServiceClient>().AddStandardResilienceHandler(options =>
{
options.Retry.BackoffType =
DelayBackoffType.Constant; // oder Linear oder Exponential
options.Retry.Delay = TimeSpan.FromSeconds(1);
options.Retry.MaxRetryAttempts = 5;
options.Retry.OnRetry = static (args) =>
{
CUI.Cyan($"Versuch #{args.AttemptNumber} Zeit seit letztem Versuch:{(int)(DateTime.Now - lastTry).TotalMilliseconds} ms Dauer:{args.Duration} Grund:{args.Outcome.Result} \n");
lastTry = DateTime.Now;
return ValueTask.CompletedTask;
};
}
);
(rme)