web-dev-qa-db-fra.com

Impossible de définir l'en-tête Content-Type

Je ne parviens pas à définir le type de contenu sur HttpClient . J'ai suivi cette question: Comment définir l'en-tête Content-Type pour une demande HttpClient? Mais toujours pas de chance.

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 J'ai également essayé d'utiliser la bibliothèque Flurl, mais elle se bloque lorsque j'essaie d'ajouter le 'Content-Type'.

misused header name content-type

Alors, comment puis-je le forcer pour qu’il l’ajoute vraiment? Merci d’avance.

11
tim

Je pense que tu devrais essayer ça

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

checkout this links:

Comment définissez-vous l'en-tête Content-Type pour une demande HttpClient?

Modifier

Supprimer cette ligne c.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json"); et vérifier

20
Ajay P

UPDATE: voir nouvelle réponse pour les types de contenu autres que ceux par défaut

Avec Flurl, vous n'avez pas besoin de définir Content-Type sur application/json pour des méthodes telles que PostJsonAsync. Dans ce cas, il s’agit du type de contenu par défaut qui sera défini pour vous.

3
Todd Menier

La dernière et meilleure réponse à cela avec Flurl est de upgrade . 2.0 introduit plusieurs améliorations dans le département des en-têtes:

  1. Ils ne sont plus validés. Flurl utilise maintenant TryAddWithoutValidation sous le capot, de sorte que vous n'aurez jamais l'erreur "nom d'en-tête mal utilisé" avec les méthodes WithHeader(s). (J'ai toujours trouvé que le comportement de validation était un peu surprotecteur.)

  2. Dans un appel fluide, ils sont définis au niveau de la demande individuelle plutôt qu'au niveau FlurlClient, de sorte que vous ne rencontrez pas problèmes de simultanéité lors de la réutilisation du client.

  3. Les traits d'union étant courants dans les noms d'en-tête mais non autorisés dans les identificateurs C #, il existe une nouvelle convention où les traits de soulignement sont convertis en traits d'union, vous n'avez donc pas à abandonner la notation d'objet lorsque vous spécifiez plusieurs:

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