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.

In Pocket speichern vorlesen Druckansicht
Netzwerkstecker

(Bild: asharkyu/Shutterstock.com)

Lesezeit: 1 Min.
Von
  • 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.

Der Dotnet-Doktor – Holger Schwichtenberg

Dr. Holger Schwichtenberg ist technischer Leiter des Expertennetzwerks www.IT-Visions.de, das mit 53 renommierten Experten zahlreiche mittlere und große Unternehmen durch Beratungen und Schulungen sowie bei der Softwareentwicklung unterstützt. Durch seine Auftritte auf zahlreichen nationalen und internationalen Fachkonferenzen sowie mehr als 90 Fachbücher und mehr als 1500 Fachartikel gehört Holger Schwichtenberg zu den bekanntesten Experten für .NET und Webtechniken in Deutschland.

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);
  }
 }

Der Standard-Handler erledigt fünf Dinge in einer sogenannten Pipeline (Abb. 1).

(Bild: Microsoft)

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)