Невозможно установить заголовок Content-Type
У меня возникли проблемы с настройкой Content-Type на HttpClient.
Я последовал этому вопросу: Как установить заголовок Content-Type для запроса HttpClient?
Но все равно не повезло.
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);
});
Я также попробовал использовать библиотеку Flurl, но при попытке добавить "Content-Type" он сработает.
misused header name content-type
Итак, как я могу заставить его это добавить?
Спасибо заранее.
Ответы
Ответ 1
Я думаю, вы должны попробовать это
req.Content = new StringContent(rcString, Encoding.UTF8, "application/json");
проверить ссылки:
Как установить заголовок Content-Type для запроса HttpClient?
Изменить
Удалите эту строку c.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json");
и проверьте
Ответ 2
ОБНОВЛЕНИЕ: см. новый ответ для нестандартных типов контента
С Flurl вам не нужно устанавливать Content-Type в application/json для таких методов, как PostJsonAsync
. В этом случае это тип содержимого по умолчанию, и он будет установлен для вас.
Ответ 3
Последний и самый лучший ответ на этот вопрос с Flurl - upgrade. 2.0 вводит несколько улучшений в разделе заголовков:
-
Они больше не проверяются. Flurl теперь использует TryAddWithoutValidation
под капотом, поэтому вы никогда не получите ошибку "неправильное имя заголовка" с помощью методов WithHeader(s)
. (Я всегда считал, что поведение проверки является немного чрезмерным.)
-
При безупречном вызове они устанавливаются на уровне индивидуального запроса, а не на уровне FlurlClient
, поэтому вы не будете работать в concurrency проблемы при повторном использовании клиента.
-
Поскольку дефисы обычно встречаются в именах заголовков, но не разрешены в идентификаторах С#, там новое соглашение, где символы подчеркивания преобразуются в дефисы поэтому вам не нужно отказываться от обозначения объекта при указании нескольких:
url.WithHeaders(new { Content_Type = "foo", ... }