HTTP POST Request in .NET mit C# senden: Vom Anfänger zum Profi
\n\nStell dir vor, deine C#-Anwendung ist ein Kurier, der ein Paket (Daten) an eine bestimmte Adresse (URL) liefern und eine Bestätigung (Antwort) einholen muss. Genau diese Aufgabe löst ein HTTP POST Request. Auf Stack Overflow wird diese Frage tausendfach aufgerufen – und das aus gutem Grund: Die Arbeit mit externen APIs, das Senden von Formularen und das Hochladen von Daten auf Server gehören zum täglichen Brot eines jeden .NET-Entwicklers.
\n\nIn diesem Artikel zeigen wir dir drei grundlegende Methoden zum Senden eines POST-Requests in .NET (C#) – angefangen beim modernen HttpClient bis hin zum klassischen WebRequest. Du lernst, wie du JSON und URL-kodierte Daten überträgst, Fehler behandelst und typische Anfängerfehler vermeidest. Los geht's!
1. Der moderne Ansatz: HttpClient (empfohlen)
\n\nSeit .NET Framework 4.5 und in allen Versionen von .NET Core / .NET 5+ ist die Klasse HttpClient der De-facto-Standard. Sie ist für asynchrone Arbeit ausgelegt, unterstützt die Wiederverwendung von Verbindungen und lässt sich einfach konfigurieren.
1.1. Einfacher POST mit JSON (der häufigste Anwendungsfall)
\n\nAngenommen, wir müssen Benutzerdaten im JSON-Format an einen Server senden. So sieht das im echten Code aus:
\n\nusing System;\nusing System.Net.Http;\nusing System.Text;\nusing System.Text.Json;\nusing System.Threading.Tasks;\n\npublic class UserService\n{\n private readonly HttpClient _httpClient;\n\n public UserService(HttpClient httpClient)\n {\n _httpClient = httpClient;\n }\n\n public async Task<UserResponse> CreateUserAsync(UserDto newUser)\n {\n // 1. Objekt in JSON serialisieren\n var json = JsonSerializer.Serialize(newUser);\n var content = new StringContent(json, Encoding.UTF8, "application/json");\n\n // 2. POST senden\n HttpResponseMessage response = await _httpClient.PostAsync("https://api.example.com/users", content);\n\n // 3. Antwort lesen\n response.EnsureSuccessStatusCode(); // Wirft eine Exception, wenn Status nicht 2xx ist\n\n var responseBody = await response.Content.ReadAsStringAsync();\n return JsonSerializer.Deserialize<UserResponse>(responseBody);\n }\n}\n\n// Beispiel zur Verwendung\npublic class Program\n{\n public static async Task Main()\n {\n var client = new HttpClient();\n var service = new UserService(client);\n \n var user = new UserDto { Name = "Max", Email = "max@example.com" };\n var result = await service.CreateUserAsync(user);\n Console.WriteLine($"Benutzer mit ID erstellt: {result.Id}");\n }\n}\n\npublic class UserDto\n{\n public string Name { get; set; }\n public string Email { get; set; }\n}\n\npublic class UserResponse\n{\n public int Id { get; set; }\n}\n\nWichtige Punkte:
\n- \n
- Verwende immer
async/await– so wird der Thread nicht blockiert. \n EnsureSuccessStatusCode()ist dein bester Freund für eine schnelle Fehlerprüfung. \n - Erstelle nicht für jede Anfrage einen neuen
HttpClient– das führt zu Socket Exhaustion (Socket-Erschöpfung). NutzeIHttpClientFactoryin ASP.NET Core oder eine statische Instanz. \n
1.2. POST mit Formulardaten (application/x-www-form-urlencoded)
\n\nManchmal erwartet die API Daten im Format einer normalen HTML-Form. Dafür verwenden wir FormUrlEncodedContent:
public async Task<string> PostFormDataAsync(string username, string password)\n{\n var formData = new Dictionary<string, string>\n {\n { "grant_type", "password" },\n { "username", username },\n { "password", password }\n };\n\n var content = new FormUrlEncodedContent(formData);\n\n using var client = new HttpClient();\n var response = await client.PostAsync("https://api.example.com/token", content);\n response.EnsureSuccessStatusCode();\n\n return await response.Content.ReadAsStringAsync();\n}\n\nTipp: Vergiss nicht, die HttpClient-Instanz ordnungsgemäß zu verwalten. In Produktionsumgebungen ist IHttpClientFactory die bevorzugte Lösung.
2. Der klassische Weg: WebRequest (für Legacy-Code)
\n\nObwohl WebRequest (bzw. HttpWebRequest) in modernen .NET-Versionen als veraltet gilt, findest du ihn noch in älteren Codebasen. Hier ein kurzes Beispiel:
using System;\nusing System.IO;\nusing System.Net;\nusing System.Text;\n\npublic class LegacyPostExample\n{\n public static void SendPost()\n {\n var request = (HttpWebRequest)WebRequest.Create("https://api.example.com/data");\n request.Method = "POST";\n request.ContentType = "application/json";\n\n var json = "{\\"name\\":\\"Anna\\",\\"age\\":30}";\n var byteArray = Encoding.UTF8.GetBytes(json);\n request.ContentLength = byteArray.Length;\n\n using (var dataStream = request.GetRequestStream())\n {\n dataStream.Write(byteArray, 0, byteArray.Length);\n }\n\n using (var response = (HttpWebResponse)request.GetResponse())\n using (var reader = new StreamReader(response.GetResponseStream()))\n {\n Console.WriteLine(reader.ReadToEnd());\n }\n }\n}\n\nHinweis: Für neue Projekte solltest du immer HttpClient bevorzugen. WebRequest wird nur noch aus Kompatibilitätsgründen gezeigt.
3. Fehlerbehandlung und Best Practices
\n\nEin robuster POST-Request sollte immer Fehler abfangen. Hier ein erweitertes Beispiel mit try-catch:
public async Task<UserResponse> CreateUserSafeAsync(UserDto newUser)\n{\n try\n {\n var json = JsonSerializer.Serialize(newUser);\n var content = new StringContent(json, Encoding.UTF8, "application/json");\n\n var response = await _httpClient.PostAsync("https://api.example.com/users", content);\n response.EnsureSuccessStatusCode();\n\n var responseBody = await response.Content.ReadAsStringAsync();\n return JsonSerializer.Deserialize<UserResponse>(responseBody);\n }\n catch (HttpRequestException ex)\n {\n Console.WriteLine($"Netzwerkfehler: {ex.Message}");\n throw;\n }\n catch (TaskCanceledException)\n {\n Console.WriteLine("Zeitüberschreitung der Anfrage.");\n throw;\n }\n}\n\nBest Practices auf einen Blick:
\n- \n
- Timeouts setzen: Verwende
CancellationTokenund konfiguriereHttpClient.Timeout. \n - Wiederverwendung von HttpClient: Vermeide
new HttpClient()in jeder Methode. \n - Korrekte Content-Types: Setze immer den passenden
Content-Type-Header (z. B.application/json). \n - Asynchron arbeiten: Nutze
async/awaitfür bessere Skalierbarkeit. \n
Fazit
\n\nDas Senden eines HTTP POST Requests in .NET mit C# ist mit HttpClient einfach und effizient. Egal ob du JSON, Formulardaten oder andere Formate überträgst – die moderne API bietet dir alle Werkzeuge, die du brauchst. Vermeide veraltete Methoden wie WebRequest und setze auf asynchrone Programmierung mit async/await. So bist du bestens gerüstet für die Arbeit mit REST-APIs und Webdiensten.
Hast du Fragen oder Anregungen? Hinterlasse einen Kommentar – wir helfen dir gerne weiter!