it-swarm.com.ru

Не могу установить заголовок 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);
});

Debugger Я также пытался использовать библиотеку Flurl, но она вылетает при попытке добавить 'Content-Type'.

misused header name content-type

Так, как я могу заставить это так, это действительно добавляет это? Заранее спасибо.

11
tim

Я думаю, вы должны попробовать это

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

оформить заказ по ссылкам:

Как вы устанавливаете заголовок Content-Type для запроса HttpClient?

Правка

Удалите эту строку c.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json"); и проверьте

20
Ajay P

ОБНОВЛЕНИЕ: см. новый ответ для типов содержимого не по умолчанию

С Flurl вам не нужно устанавливать Content-Type для application/json для таких методов, как PostJsonAsync. В данном случае это тип контента по умолчанию, и он будет установлен для вас.

3
Todd Menier

Последний и лучший ответ на этот вопрос с Flurl - upgrade . 2.0 вводит несколько улучшений в отдел заголовков:

  1. Они больше не проверены. Flurl теперь использует TryAddWithoutValidation под капотом, поэтому вы никогда не получите ошибку «неправильное имя заголовка» с методами WithHeader(s). (Я всегда считал, что проверка правильности немного излишняя.)

  2. При быстром вызове они устанавливаются на уровне отдельного запроса, а не на уровне FlurlClient, поэтому вы не столкнетесь с проблемами параллелизма при повторном использовании клиента.

  3. Так как дефисы являются общими в именах заголовков, но не допускаются в идентификаторах C #, есть новое соглашение , где подчеркивания преобразуются в дефисы, поэтому вам не нужно отказываться от записи объекта при указании множественного числа:

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