Warum ist Content-Type der Schmerz jedes C#-Entwicklers?
\n\nHaben Sie jemals eine POST-Anfrage über HttpClient in C# gesendet und der Server antwortete mit einem mysteriösen Fehler 415 (Unsupported Media Type)? Kommt Ihnen bekannt vor, oder? Meistens liegt das Problem an einem kleinen, aber entscheidenden Header – dem Content-Type. Ohne ihn weiß der Server einfach nicht, wie er Ihre Daten interpretieren soll: Sind es JSON, XML oder ein normales Formular?
In diesem Artikel analysieren wir, wie Sie Content-Type für HttpClient in C# richtig setzen, betrachten die häufigsten Fallstricke, auf die Anfänger (und nicht nur sie) hereinfallen, und lernen, Anfragen so zu senden, dass der Server Sie auf Anhieb versteht. Los geht's!
\n\nWas ist Content-Type und wozu wird er benötigt?
\n\nContent-Type ist ein HTTP-Header, der dem Server angibt, in welchem Format die Daten im Anfrage- (oder Antwort-) Körper übertragen werden. Wenn Sie JSON senden, müssen Sie application/json angeben. Bei XML – application/xml. Bei Formulardaten – application/x-www-form-urlencoded.
In C# ist HttpClient ein mächtiges, aber tückisches Werkzeug. Es kann das Format selbst erraten, muss es aber nicht. Und wenn Sie versuchen, den Header einfach über DefaultRequestHeaders hinzuzufügen, erwartet Sie eine unangenehme Überraschung: Content-Type ist kein Teil der Standard-Anfrage-Header. Er bezieht sich nur auf den Anforderungskörper.
Typischer Anfängerfehler
\n\nvar client = new HttpClient();\nclient.DefaultRequestHeaders.Add("Content-Type", "application/json"); // ❌ FEHLER!\n\n\nDieser Code löst eine InvalidOperationException mit der Meldung aus: "Misused header name. Make sure request headers are used with HttpRequestMessage, response ones with HttpResponseMessage, and content ones with HttpContent objects." Klingt beängstigend, aber die Lösung ist einfach – lesen Sie weiter.
Drei Möglichkeiten, Content-Type in C# HttpClient zu setzen
\n\nMöglichkeit 1: StringContent verwenden (am einfachsten)
\n\nDer beliebteste und korrekteste Weg ist, den Header zusammen mit dem Anforderungskörper über die Klasse StringContent zu übergeben.
using System;\nusing System.Net.Http;\nusing System.Text;\nusing System.Threading.Tasks;\n\nclass Program\n{\n static async Task Main()\n {\n var client = new HttpClient();\n var json = "{ \\"name\\": \\"PythonLib\\", \\"type\\": \\"education\\" }";\n \n // Inhalt mit expliziter Angabe des Content-Type erstellen\n var content = new StringContent(json, Encoding.UTF8, "application/json");\n \n var response = await client.PostAsync("https://api.example.com/data", content);\n Console.WriteLine(await response.Content.ReadAsStringAsync());\n }\n}\n\n\nIn diesem Beispiel wird Content-Type: application/json; charset=utf-8 automatisch gesetzt. Der zweite Parameter (Encoding.UTF8) gibt die Kodierung an, der dritte den Medientyp. Voilà – der Server ist zufrieden!
Möglichkeit 2: Über ByteArrayContent (für Fortgeschrittene)
\n\nWenn Sie mit Binärdaten arbeiten oder die volle Kontrolle wünschen, verwenden Sie ByteArrayContent.
using System.Net.Http;\nusing System.Text;\n\nvar jsonBytes = Encoding.UTF8.GetBytes("{ \\"message\\": \\"Hello\\" }");\nvar content = new ByteArrayContent(jsonBytes);\ncontent.Headers.ContentType = new MediaTypeHeaderValue("application/json");\n\nvar response = await client.PostAsync("https://api.example.com/upload", content);\n\n\nHier setzen wir ContentType manuell über die Eigenschaft Headers. Diese Methode ist praktisch, wenn Sie zusätzliche Header (z. B. Content-Encoding) hinzufügen müssen.
Möglichkeit 3: HttpRequestMessage + vollständige Kontrolle
\n\nManchmal müssen Sie eine GET-Anfrage mit einem Körper senden (ja, das ist auch möglich) oder Header auf Anfrageebene überschreiben. Dann kommt