Не удается установить заголовок 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

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


person tim    schedule 04.03.2015    source источник


Ответы (3)


Я думаю тебе стоит попробовать это

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

проверить эти ссылки:

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

Редактировать

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

person Ajay    schedule 04.03.2015
comment
Теперь устанавливается заголовок, и это одно. Но я получаю 403. Однако в Postman запрос возвращает json. - person tim; 04.03.2015
comment
@TimRijckaert означает, что он не может принять результат json. - person Ajay; 04.03.2015
comment
Хм, да, теперь я вижу проблему. Один из моих заголовков имеет \ value \. Поэтому мне нужно отключить строку. - person tim; 04.03.2015

ОБНОВЛЕНИЕ: см. новый ответ для типов контента, отличных от стандартных

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

person Todd Menier    schedule 04.03.2015
comment
Что ж, похоже, что параметр my был неправильно преобразован, поэтому я дам еще одну попытку Flurl, поскольку он значительно упростил код. Спасибо - person tim; 04.03.2015
comment
Пока вы не столкнетесь с API, который действительно требует, чтобы вы установили заголовок Content-Type в запросе POST: - / - person quentin-starin; 18.01.2016
comment
@qes, вы говорите, что публикуете данные в формате JSON, но API требует, чтобы вы установили Content-Type other, кроме application / json? - person Todd Menier; 18.01.2016
comment
@ToddMenier Это мыльный xml api для полетных данных, и я должен установить его в text / xml при публикации тела запроса xml, иначе api вернет 415. Я мог пропустить это, но я не мог понять как заставить Flurl сделать это. Однако приведенное выше решение Ajay с использованием HttpClient работает для меня. - person quentin-starin; 19.01.2016
comment
@qes вы пробовали .WithHeader("Content-Type", "text/xml") в вызове flurl? - person Todd Menier; 19.01.2016
comment
@ToddMenier Да, это приводит к недопустимой операции исключения: неправильное имя заголовка. Убедитесь, что заголовки запроса используются с HttpRequestMessage, заголовки ответов с HttpResponseMessage и заголовки содержимого с объектами HttpContent. Это происходит из System.Net.Http.Headers.HttpHeaders.Add (...) - person quentin-starin; 25.01.2016

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

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

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

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

    url.WithHeaders(new { Content_Type = "foo", ... }
    
person Todd Menier    schedule 24.10.2017