HTTP-Client in C#: Anfragen richtig von A bis Z stellen
\n\nIn der modernen Entwicklung auf der .NET-Plattform ist die Arbeit mit HTTP-Anfragen eine der wichtigsten Aufgaben. Ob es sich um die Integration mit einer externen REST-API, das Senden von Daten an einen Server oder das Herunterladen von Webseiten handelt – die korrekte Verwendung von HttpClient in C# ist entscheidend für die Leistung und Stabilität einer Anwendung. In diesem Artikel werden wir alle Aspekte der Arbeit mit dem HTTP-Client in C# behandeln: von grundlegenden Beispielen bis hin zu fortgeschrittenen Techniken, Fehlerbehandlung und Best Practices.
1. Grundlagen der Arbeit mit HttpClient in C#
\n\nHttpClient ist die Hauptklasse in .NET zum Senden von HTTP-Anfragen und Empfangen von Antworten. Sie befindet sich im Namensraum System.Net.Http und ist ab .NET Framework 4.5 sowie in allen Versionen von .NET Core/.NET 5+ verfügbar.
Wichtige Regel: HttpClient ist für die Wiederverwendung ausgelegt. Für jede Anfrage eine neue Instanz zu erstellen, ist ein Anti-Pattern, das zur Erschöpfung von Sockets (socket exhaustion) führen kann. Verwenden Sie stattdessen eine einzelne statische Instanz oder eine Singleton-Instanz.
Ein grundlegendes Beispiel einer GET-Anfrage:
\n\nusing System;\nusing System.Net.Http;\nusing System.Threading.Tasks;\n\nclass Program\n{\n private static readonly HttpClient client = new HttpClient();\n\n static async Task Main(string[] args)\n {\n try\n {\n HttpResponseMessage response = await client.GetAsync("https://api.example.com/data");\n response.EnsureSuccessStatusCode();\n string responseBody = await response.Content.ReadAsStringAsync();\n Console.WriteLine(responseBody);\n }\n catch (HttpRequestException e)\n {\n Console.WriteLine($"Anfragefehler: {e.Message}");\n }\n }\n}\n\nIn diesem Beispiel erstellen wir einen statischen HttpClient, senden eine GET-Anfrage, überprüfen den Erfolg der Antwort mit EnsureSuccessStatusCode() und lesen den Antworttext als Zeichenfolge.
2. Arten von HTTP-Anfragen und Arbeiten mit Headern
\n\nNeben GET unterstützt HttpClient alle gängigen HTTP-Methoden: POST, PUT, DELETE, PATCH und andere. Betrachten wir das Senden einer POST-Anfrage mit JSON-Daten – dies ist das häufigste Szenario bei der Arbeit mit REST-APIs.
Beispiel einer POST-Anfrage mit JSON:
\n\nusing System;\nusing System.Net.Http;\nusing System.Text;\nusing System.Text.Json;\nusing System.Threading.Tasks;\n\nclass Program\n{\n private static readonly HttpClient client = new HttpClient();\n\n static async Task Main(string[] args)\n {\n var data = new { Name = "John", Age = 30 };\n string json = JsonSerializer.Serialize(data);\n var content = new StringContent(json, Encoding.UTF8, "application/json");\n\n try\n {\n HttpResponseMessage response = await client.PostAsync("https://api.example.com/users", content);\n response.EnsureSuccessStatusCode();\n string result = await response.Content.ReadAsStringAsync();\n Console.WriteLine($"Benutzer erstellt: {result}");\n }\n catch (HttpRequestException e)\n {\n Console.WriteLine($"Fehler: {e.Message}");\n }\n }\n}\n\nArbeiten mit Headern: Oft erfordern APIs die Übergabe von Authentifizierungstokens oder anderen Headern. Diese können auf zwei Arten hinzugefügt werden:
\n\n- \n
- Global – über die Eigenschaft
DefaultRequestHeaders(für alle Anfragen des Clients). \n - Lokal – über die Sammlung
Headersim ObjektHttpRequestMessage(für eine bestimmte Anfrage). \n
Beispiel für das Hinzufügen eines Authorization-Headers:
\n\n// Global\nclient.DefaultRequestHeaders.Authorization = \n new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", "your-token");\n\n// Lokal\nvar request = new HttpR