Hinzufügen von Gesundheitsprüfungen - Erstellen einer Beispiel-API in C# Kurs
Das Entwickeln und Testen von RESTful APIs in C# mit ASP.NET Core ist eine praktische Fähigkeit für jeden modernen Backend-Entwickler. In seinem Tutorial-Video "Adding Health Checks - Building a Sample API in C# Course" führt Tim Corey durch die Erstellung einer Beispiel-API mit integrierten Health Checks. Dieser Artikel, der ausschließlich auf Tims Mitschrift basiert, erklärt den gesamten Prozess Schritt für Schritt und deckt dabei wichtige Punkte wie die Verwendung von public async Task, int id, var app und anderen HTTP-Anforderungsmethoden ab.
Sehen wir uns genauer an, wie Tim Corey mit Visual Studio Code Zustandsprüfungen in einem C#-API-Projekt einrichtet.
Einführung in die Beispiel-API und Gesundheitsprüfungen
Tim erklärt, dass eine Beispiel-API ein leistungsfähiges Werkzeug beim Erlernen der Webentwicklung ist. Sie ermöglicht es Entwicklern, API-Aufrufe mit GET-, POST-, PUT- und DELETE-Methoden zu simulieren, mit entsprechenden Anfragedaten und Statuscodes. Die von Tim erstellte API unterstützt:
-
Beispieldaten mit einem Datenmodell
-
RESTful-Verhaltensweisen für API-Anfragen
-
Antworten im JSON-Format
-
Gesundheitschecks
- Bereitstellung sowohl als Docker-Container als auch als Webanwendungen
Installation des Pakets Health Checks
Tim öffnet das Projekt in Visual Studio Code und klickt mit der rechten Maustaste auf "Abhängigkeiten", um NuGet-Pakete zu verwalten. Er sucht und installiert das Paket AspNetCore.HealthChecks.UI.Client. So kann die App zwei Arten von Gesundheitschecks unterstützen.
Erstellen von Health Check-Klassen
Tim fügt einen neuen Ordner mit dem Namen HealthChecks innerhalb des API-Projektordners hinzu. Hier erstellt er mehrere Klassen, die die Schnittstelle IHealthCheck implementieren, wobei jede einen anderen Status repräsentiert: healthy, degraded, unhealthy und random.
GesundheitsCheck.cs
Diese Klasse gibt ein HealthCheckResult.Healthy mithilfe einer öffentlichen asynchronen Task
return Task.FromResult(HealthCheckResult.Healthy("This is a test healthy service."));
return Task.FromResult(HealthCheckResult.Healthy("This is a test healthy service."));
Dies simuliert einen gesunden Status, der nützlich ist, um zu testen, wie Ihr Frontend mit einem stabilen Dienst umgeht.
DegradedHealthCheck.cs
return Task.FromResult(HealthCheckResult.Degraded("This is a test degraded service."));
return Task.FromResult(HealthCheckResult.Degraded("This is a test degraded service."));
Diese Prüfung liefert eine verschlechterte Dienstantwort. Es ist eine einfache Möglichkeit, Teilausfälle oder Leistungsprobleme zu simulieren.
UnhealthyHealthCheck.cs
return Task.FromResult(HealthCheckResult.Unhealthy("This is a test unhealthy service."));
return Task.FromResult(HealthCheckResult.Unhealthy("This is a test unhealthy service."));
Dies ahmt einen fehlgeschlagenen Dienst nach und simuliert Fälle, in denen Sie einen HTTP-Statuscode 500 oder die Rückgabe von NotFound() erwarten würden.
RandomHealthCheck.cs
Dieser Gesundheitscheck verwendet eine zufällige Ganzzahl, um einen der drei Zustände zu simulieren:
int randomResult = Random.Shared.Next(1, 4);
return randomResult switch
{
1 => Task.FromResult(HealthCheckResult.Healthy("This is a test random service.")),
2 => Task.FromResult(HealthCheckResult.Degraded("This is a test random service.")),
3 => Task.FromResult(HealthCheckResult.Unhealthy("This is a test random service.")),
_ => Task.FromResult(HealthCheckResult.Healthy("This is a test random service."))
};
int randomResult = Random.Shared.Next(1, 4);
return randomResult switch
{
1 => Task.FromResult(HealthCheckResult.Healthy("This is a test random service.")),
2 => Task.FromResult(HealthCheckResult.Degraded("This is a test random service.")),
3 => Task.FromResult(HealthCheckResult.Unhealthy("This is a test random service.")),
_ => Task.FromResult(HealthCheckResult.Healthy("This is a test random service."))
};
Tim betont, dass dies nützlich ist, um das Verhalten unter variablen Bedingungen zu testen.
Registrierung von Gesundheitsprüfungen in der Startup-Konfiguration
Tim fügt eine neue statische Klasse HealthChecksConfig.cs in den Ordner Startup oder Konfiguration ein. Diese Klasse enthält zwei statische Methoden:
AddAllHealthChecks()
services.AddHealthChecks()
.AddCheck<RandomHealthCheck>("random", tags: new[] { "random" })
.AddCheck<HealthyHealthCheck>("healthy", tags: new[] { "healthy" })
.AddCheck<DegradedHealthCheck>("degraded", tags: new[] { "degraded" })
.AddCheck<UnhealthyHealthCheck>("unhealthy", tags: new[] { "unhealthy" });
services.AddHealthChecks()
.AddCheck<RandomHealthCheck>("random", tags: new[] { "random" })
.AddCheck<HealthyHealthCheck>("healthy", tags: new[] { "healthy" })
.AddCheck<DegradedHealthCheck>("degraded", tags: new[] { "degraded" })
.AddCheck<UnhealthyHealthCheck>("unhealthy", tags: new[] { "unhealthy" });
Damit werden alle Gesundheitsprüfungen für die Injektion von Abhängigkeiten im Dienste-Container von ASP.NET Core registriert.
MapAllHealthChecks()
app.MapHealthChecks("/health");
app.MapHealthChecks("/health");
So entsteht ein einziger Endpunkt/Gesundheitszustand, der alle Dienste zusammen bewertet. Wenn eine davon ungesund ist, wird die gesamte Prüfung als ungesund gewertet.
Erstellen von spezifischen Gesundheitsendpunkten
Um einzelne Komponenten zu testen, ordnet Tim jeden Health Check einem Tag zu:
app.MapHealthChecks("/health/healthy", new HealthCheckOptions {
Predicate = x => x.Tags.Contains("healthy")
});
app.MapHealthChecks("/health/healthy", new HealthCheckOptions {
Predicate = x => x.Tags.Contains("healthy")
});
Er wiederholt dies für /health/degraded, /health/unhealthy und /health/random. Jedes dieser Tools ermöglicht es Entwicklern, bestimmte Verhaltensweisen zu testen und zu sehen, wie ihr Frontend darauf reagiert.
Beim Besuch von /health/random wechselt die Ausgabe je nach Zufallsergebnis zwischen "healthy", "degraded" und "unhealthy".
Hinzufügen von UI-Unterstützung für Health Checks
Tim verbessert die Endpunkte, indem er eine UI-Antwort für jede Health-Check-Route ermöglicht. Dies liefert eine JSON-Ausgabe:
app.MapHealthChecks("/healthui", new HealthCheckOptions
{
ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse
});
app.MapHealthChecks("/healthui", new HealthCheckOptions
{
ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse
});
Dies ermöglicht die Überprüfung jedes Gesundheitschecks mit Daten wie Dauer, Tags und Status. Anschließend erstellt Tim UI-Versionen für jeden Gesundheitsendpunkt:
-
/healthui/healthy
-
/healthui/degradiert
-
/healthui/unhealthy
- /healthui/random
Jede Antwort enthält ein detailliertes JSON-Format, das sich ideal für RESTful-APIs und Tests von mobilen Geräten oder Webseiten aus eignet.
Abschluss des API-Projekts
Tim hebt hervor, dass Program.cs selbst mit diesen Funktionen nur 21 Zeilen lang ist. Er führt dies auf Folgendes zurück:
-
Gute Projektordnerstruktur
-
Modelle im Ordner "Models" aufbewahren
-
Platzierung von Endpunkten und Controllern in ihren eigenen Ordnern
- Verwendung von asynchronen Task-Methoden für jede Health Check-Klasse
Er betont auch, wie nützlich diese Beispiel-API in Produktionsumgebungen ist, um Latenzzeiten oder Fehler vor der Bereitstellung zu simulieren.
Wir können mit dieser API viel mehr testen, als nur GET-Aufrufe zu tätigen", so Tim abschließend.
Was kommt als nächstes
Tim gibt einen Ausblick auf die nächste Lektion, in der er simulierte Verlangsamungen (z. B. 5-Sekunden-Verzögerungen) und Fehler wie return NotFound() oder return BadRequest() hinzufügen wird, um das API-Verhalten noch weiter zu testen.
Abschluss
In diesem Video-Tutorial führt Tim Corey methodisch durch den Aufbau einer minimalen API mit integrierten Zustandsprüfungen unter Verwendung von ASP.NET Core. Die wichtigsten Komponenten sind:
-
Zustandsprüfungsklassen (gesund, beeinträchtigt, ungesund, zufällig)
-
Injektion von Abhängigkeiten über AddHealthChecks()
-
Mapping von Endpunkten mit MapHealthChecks()
- Unterstützung von strukturierten JSON-Antworten
Dieser Ansatz erleichtert die Validierung von REST-APIs, die Simulation von Fehlern und die Stärkung von Webanwendungen sowohl für Entwicklungs- als auch für Produktionsumgebungen.
