Я пытаюсь установить Content-Type
заголовок HttpClient
объекта, как того требует API, который я вызываю.
Я попытался установить Content-Type
как показано ниже:
using (var httpClient = new HttpClient())
{
httpClient.BaseAddress = new Uri("http://example.com/");
httpClient.DefaultRequestHeaders.Add("Accept", "application/json");
httpClient.DefaultRequestHeaders.Add("Content-Type", "application/json");
// ...
}
Это позволяет мне добавить Accept
заголовок, но когда я пытаюсь добавить Content-Type
его, выдается следующее исключение:
Неправильное название заголовка. Убедитесь, что заголовки запросов используются с
HttpRequestMessage
заголовками ответов и заголовкамиHttpResponseMessage
содержимого сHttpContent
объектами.
Как я могу установить Content-Type
заголовок в HttpClient
запросе?
Ответы:
Тип содержимого - это заголовок содержимого, а не запроса, поэтому это не удается.
AddWithoutValidation
как подсказал Роберт Леви, может работать, но вы также можете установить тип содержимого при создании самого содержимого запроса (обратите внимание, что фрагмент кода добавляет «application / json» в двух местах - для заголовков Accept и Content-Type):источник
Response.Content.Headers
будет работать большую часть времени.Response.Content.Headers
в отношении ASP.Net Web API, также не сработали, но вы можете легко установить его, используя,HttpContext.Current.Response.ContentType
если вам нужно.Для тех, кто не видел, что Джонс комментирует решение Карлоса ...
источник
response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/xml; charset=utf-8");
Если вы не возражаете против небольшой зависимости от библиотеки, Flurl.Http [раскрытие: я автор] делает это очень просто. Его
PostJsonAsync
метод обеспечивает сериализацию содержимого и установкуcontent-type
заголовка, а такжеReceiveJson
десериализацию ответа. Еслиaccept
требуется заголовок, вам нужно установить его самостоятельно, но Flurl также предлагает довольно простой способ сделать это:Flurl использует HttpClient и Json.NET под капотом, и это PCL, поэтому он будет работать на различных платформах.
источник
попробуйте использовать TryAddWithoutValidation
источник
Misused header name
ошибка подтверждается Dotnet ядром 2.2. Мне пришлось использовать ответ @ carlosfigueira stackoverflow.com/a/10679340/2084315 ..Net пытается заставить вас соблюдать определенные стандарты, а именно то, что
Content-Type
заголовок может быть указан только для запросов, которые имеют контент (напримерPOST
,PUT
и т. Д.). Поэтому, как указали другие, предпочтительный способ установитьContent-Type
заголовок - черезHttpContent.Headers.ContentType
свойство.С учетом сказанного, некоторые API (такие как LiquidFiles Api , по состоянию на 2016-12-19) требуют установки
Content-Type
заголовка дляGET
запроса. .Net не позволит установить этот заголовок для самого запроса - даже используяTryAddWithoutValidation
. Кроме того, вы не можете указатьContent
для запроса - даже если он имеет нулевую длину. Единственный способ, которым я мог обойти это, - прибегнуть к размышлению. Код (если кому-то еще это нужно)Редактировать:
Как отмечено в комментариях, это поле имеет разные имена в разных версиях dll. В исходном коде на GitHub поле в данный момент называется
s_invalidHeaders
. Пример был изменен для учета этого по предложению @David Thompson.источник
Некоторая дополнительная информация о .NET Core (после прочтения сообщения erdomke о настройке частного поля для предоставления типа контента по запросу, у которого нет контента) ...
После отладки своего кода я не вижу приватного поля, которое можно установить с помощью отражения, поэтому я решил попытаться воссоздать проблему.
Я пробовал следующий код, используя .Net 4.6:
И, как и ожидалось, я получаю совокупное исключение с контентом
"Cannot send a content-body with this verb-type."
Однако, если я делаю то же самое с .NET Core (1.1) - я не получаю исключения. На мой запрос довольно успешно ответил серверное приложение, и тип контента был выбран.
Я был приятно удивлен этим, и я надеюсь, что это кому-то поможет!
источник
Позвоните
AddWithoutValidation
вместоAdd
(см. Эту ссылку MSDN ).В качестве альтернативы, я предполагаю, что API, который вы используете, действительно требует этого только для запросов POST или PUT (не обычных запросов GET). В этом случае, когда вы вызываете
HttpClient.PostAsync
и передаетеHttpContent
, установите это дляHeaders
свойства этогоHttpContent
объекта.источник
Для тех, кто обеспокоен
charset
У меня был особый случай, когда поставщик услуг не принимал кодировку, и он отказывался изменять подструктуру, чтобы позволить это ... К сожалению, HttpClient устанавливал заголовок автоматически через StringContent, и независимо от того, передали ли вы null или Encoding.UTF8, он всегда будет устанавливать кодировку ...
Сегодня я был на грани изменения подсистемы; переходя от HttpClient к чему-либо еще, что-то пришло мне в голову ... почему бы не использовать отражение, чтобы очистить "кодировку"? ... И еще до того, как я попробовал это, я подумал о способе "возможно, я смогу изменить его после инициализации", и это сработало.
Вот как вы можете установить точный заголовок "application / json" без "; charset = utf-8".
Примечание:
null
значение в дальнейшем не будет работать, и Append «; кодировка = UTF-8»РЕДАКТИРОВАТЬ
@DesertFoxAZ предлагает использовать следующий код и работает нормально. (сам не проверял)
источник
Это все, что вам нужно.
С использованием Newtonsoft.Json, если вам нужен контент в виде строки json.
источник
HttpMessageHandler handler = new WebRequestHandler(); HttpResponseMessage result; using (var client = (new HttpClient(handler, true))) { result = client.PostAsync(fullUri, content).Result; }
Хорошо, это не HTTPClient, но если вы можете использовать его, WebClient довольно прост:
источник
Вы можете использовать это, это будет работать!
источник
Я считаю это наиболее простым и легким для понимания следующим образом:
источник
Вам нужно сделать это так:
источник