HTTP POST in .NET senden: C#-Guide für Einsteiger & Profis

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

HTTP POST Request in .NET mit C# senden: Vom Anfänger zum Profi

\n\n

Stell 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\n

In 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!

\n\n

1. Der moderne Ansatz: HttpClient (empfohlen)

\n\n

Seit .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.

\n\n

1.1. Einfacher POST mit JSON (der häufigste Anwendungsfall)

\n\n

Angenommen, wir müssen Benutzerdaten im JSON-Format an einen Server senden. So sieht das im echten Code aus:

\n\n
using 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\n

Wichtige 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). Nutze IHttpClientFactory in ASP.NET Core oder eine statische Instanz.
  • \n
\n\n

1.2. POST mit Formulardaten (application/x-www-form-urlencoded)

\n\n

Manchmal erwartet die API Daten im Format einer normalen HTML-Form. Dafür verwenden wir FormUrlEncodedContent:

\n\n
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\n

Tipp: Vergiss nicht, die HttpClient-Instanz ordnungsgemäß zu verwalten. In Produktionsumgebungen ist IHttpClientFactory die bevorzugte Lösung.

\n\n

2. Der klassische Weg: WebRequest (für Legacy-Code)

\n\n

Obwohl WebRequest (bzw. HttpWebRequest) in modernen .NET-Versionen als veraltet gilt, findest du ihn noch in älteren Codebasen. Hier ein kurzes Beispiel:

\n\n
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\n

Hinweis: Für neue Projekte solltest du immer HttpClient bevorzugen. WebRequest wird nur noch aus Kompatibilitätsgründen gezeigt.

\n\n

3. Fehlerbehandlung und Best Practices

\n\n

Ein robuster POST-Request sollte immer Fehler abfangen. Hier ein erweitertes Beispiel mit try-catch:

\n\n
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\n

Best Practices auf einen Blick:

\n
    \n
  • Timeouts setzen: Verwende CancellationToken und konfiguriere HttpClient.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/await für bessere Skalierbarkeit.
  • \n
\n\n

Fazit

\n\n

Das 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.

\n\n

Hast du Fragen oder Anregungen? Hinterlasse einen Kommentar – wir helfen dir gerne weiter!

Blogs

Buchempfehlungen