web-dev-qa-db-de.com

Content-Type-Header kann nicht gesetzt werden

Ich habe Probleme beim Festlegen des Content-Type für HttpClient . Ich folgte dieser Frage: Wie wird der Content-Type-Header für eine HttpClient-Anforderung festgelegt? Aber immer noch kein Glück.

String rcString = JsonConvert.SerializeObject(new RoadsmartChecks() { userguid = user_guid, coords = coordinates, radius = (radius * 100) + "" }, ROADSMART_JSON_FORMAT, JSONNET_SETTINGS);
HttpClient c = new HttpClient();
c.BaseAddress = new Uri(BASE_URL);
c.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json"); //Keeps returning false
c.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", hash_aes);
c.DefaultRequestHeaders.TryAddWithoutValidation("Roadsmart-app", Constant.APP_ID);
c.DefaultRequestHeaders.TryAddWithoutValidation("Roadsmart-user", user_guid);
c.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpRequestMessage req = new HttpRequestMessage(HttpMethod.Post, BASE_URL + URL_CHECKS + "/fetch");
req.Content = new StringContent(rcString);
await c.SendAsync(req).ContinueWith(respTask =>
{
    Debug.WriteLine("Response: {0}", respTask.Result);
});

Debugger Ich habe es auch mit der Flurl-Bibliothek versucht, stürzt jedoch ab, wenn versucht wird, den 'Content-Type' hinzuzufügen.

misused header name content-type

Wie kann ich es erzwingen, damit es wirklich hinzugefügt wird? Vielen Dank im Voraus.

11
tim

Ich denke, du solltest es versuchen

req.Content = new StringContent(rcString, Encoding.UTF8, "application/json");

checkout diese links:

Wie setzt man den Content-Type-Header für eine HttpClient-Anfrage?

Bearbeiten

Entfernen Sie diese Zeile c.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json"); und prüfen Sie

20
Ajay P

UPDATE: Siehe neue Antwort für nicht standardmäßige Inhaltstypen

Mit Flurl sollten Sie Content-Type für Methoden wie PostJsonAsync nicht auf application/json setzen müssen. In diesem Fall ist dies der Standardinhaltstyp, der für Sie festgelegt wird.

3
Todd Menier

Die neueste und beste Antwort bei Flurl lautet: upgrade . 2.0 führt einige Verbesserungen in der Kopfzeile ein:

  1. Sie sind nicht mehr validiert. Flurl verwendet jetzt TryAddWithoutValidation unter der Haube, so dass Sie niemals den Fehler "missbrauchter Headername" mit den WithHeader(s)-Methoden erhalten. (Ich fand dieses Validierungsverhalten immer etwas übertrieben.)

  2. Bei einem fließenden Anruf werden sie auf der Ebene der einzelnen Anforderungen und nicht auf der Ebene der Variablen FlurlClient festgelegt, sodass Sie bei der Wiederverwendung des Clients nicht auf Parallelitätsprobleme stoßen.

  3. Da Bindestriche in Headernamen üblich sind, in C # -Kennungen jedoch nicht zulässig sind, gibt es eine neue Konvention , bei der Unterstriche in Bindestriche umgewandelt werden, sodass Sie bei der Angabe mehrerer nicht auf die Objektnotation verzichten müssen:

    url.WithHeaders(new { Content_Type = "foo", ... }
    
1
Todd Menier