Estou tentando definir o Content-Type
cabeçalho de um HttpClient
objeto, conforme exigido por uma API que estou chamando.
Tentei definir o Content-Type
seguinte abaixo:
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");
// ...
}
Ele permite que eu adicione o Accept
cabeçalho, mas quando tento adicioná- Content-Type
lo lança a seguinte exceção:
Nome de cabeçalho mal utilizado. Verifique se os cabeçalhos de solicitação são usados com
HttpRequestMessage
, de respostaHttpResponseMessage
e de conteúdo comHttpContent
objetos.
Como posso definir o Content-Type
cabeçalho em uma HttpClient
solicitação?
Respostas:
O tipo de conteúdo é um cabeçalho do conteúdo, não da solicitação, e é por isso que está falhando.
AddWithoutValidation
conforme sugerido por Robert Levy pode funcionar, mas você também pode definir o tipo de conteúdo ao criar o próprio conteúdo da solicitação (observe que o snippet de código adiciona "application / json" em dois locais - para os cabeçalhos Accept e Content-Type):fonte
Response.Content.Headers
funcionará na maioria das vezes.Response.Content.Headers
para a API da Web do ASP.Net também não funcionou, mas você pode configurá-lo facilmente usando,HttpContext.Current.Response.ContentType
se necessário.Para quem não viu o Johns comentar a solução carlos ...
fonte
response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/xml; charset=utf-8");
Se você não se importa com uma pequena dependência de biblioteca, o Flurl.Http [divulgação: eu sou o autor] torna isso extremamente simples. Seu
PostJsonAsync
método cuida da serialização do conteúdo e da configuração docontent-type
cabeçalho eReceiveJson
desserializa a resposta. Se oaccept
cabeçalho for necessário, você precisará definir isso sozinho, mas o Flurl também oferece uma maneira bastante limpa de fazer isso:O Flurl usa o HttpClient e o Json.NET sob o capô, e é um PCL para funcionar em várias plataformas.
fonte
tente usar TryAddWithoutValidation
fonte
Misused header name
erro é confirmado com o dotnet core 2.2. Eu tive que usar a resposta de @ carlosfigueira stackoverflow.com/a/10679340/2084315 ..Net tenta forçá-lo a obedecer a certas normas, ou seja, que o
Content-Type
cabeçalho só pode ser especificada em pedidos que tenham conteúdo (por exemploPOST
,PUT
, etc.). Portanto, como outros indicaram, a maneira preferida de definir oContent-Type
cabeçalho é através daHttpContent.Headers.ContentType
propriedadeCom isso dito, determinadas APIs (como a LiquidFiles Api , em 19/12/2016) exigem a configuração do
Content-Type
cabeçalho para umaGET
solicitação. .Net não permitirá definir esse cabeçalho na própria solicitação - mesmo usandoTryAddWithoutValidation
. Além disso, você não pode especificar aContent
para a solicitação - mesmo que seja de comprimento zero. A única maneira que eu conseguia contornar isso era recorrer à reflexão. O código (no caso de alguém precisar dele) éEditar:
Conforme observado nos comentários, esse campo tem nomes diferentes em diferentes versões da DLL. No código fonte do GitHub , o campo está atualmente nomeado
s_invalidHeaders
. O exemplo foi modificado para explicar isso de acordo com a sugestão de @David Thompson.fonte
Algumas informações adicionais sobre o .NET Core (depois de ler a postagem de erdomke sobre como definir um campo privado para fornecer o tipo de conteúdo em uma solicitação que não possui conteúdo) ...
Depois de depurar meu código, não consigo ver o campo privado para definir via reflexão - então pensei em tentar recriar o problema.
Eu tentei o seguinte código usando o .Net 4.6:
E, como esperado, recebo uma exceção agregada com o conteúdo
"Cannot send a content-body with this verb-type."
No entanto, se eu fizer a mesma coisa com o .NET Core (1.1) - não recebo uma exceção. Minha solicitação foi atendida com satisfação pelo meu aplicativo de servidor e o tipo de conteúdo foi escolhido.
Fiquei agradavelmente surpreso com isso, e espero que ajude alguém!
fonte
Ligue em
AddWithoutValidation
vez deAdd
(consulte este link do MSDN ).Como alternativa, acho que a API que você está usando realmente exige isso apenas para solicitações POST ou PUT (não solicitações GET comuns). Nesse caso, quando você chamar
HttpClient.PostAsync
e passar umHttpContent
, defina isso naHeaders
propriedade desseHttpContent
objeto.fonte
Para aqueles que se preocuparam com
charset
Eu tive um caso muito especial de que o provedor de serviços não aceitava charset e eles se recusam a alterar a subestrutura para permitir isso ... Infelizmente, o HttpClient estava configurando o cabeçalho automaticamente por meio de StringContent, e não importa se você passa nulo ou Encoding.UTF8, sempre definirá o conjunto de caracteres ...
Hoje eu estava no limite para mudar o subsistema; passando de HttpClient para qualquer outra coisa, que algo veio à minha mente ..., por que não usar a reflexão para esvaziar o "conjunto de caracteres"? ... E antes mesmo de tentar, pensei em uma maneira "talvez eu possa alterá-lo após a inicialização", e funcionou.
Veja como você pode definir o cabeçalho "application / json" exato sem "; charset = utf-8".
Nota: O
null
valor a seguir não funcionará e acrescente "; charset = utf-8"EDITAR
O @DesertFoxAZ sugere que também o código a seguir pode ser usado e funciona bem. (eu mesmo não testei)
fonte
É tudo o que você precisa.
Com o uso do Newtonsoft.Json, se você precisar de um conteúdo como json string.
fonte
HttpMessageHandler handler = new WebRequestHandler(); HttpResponseMessage result; using (var client = (new HttpClient(handler, true))) { result = client.PostAsync(fullUri, content).Result; }
Ok, não é HTTPClient, mas se você pode usá-lo, o WebClient é bastante fácil:
fonte
Você pode usar isso, será trabalho!
fonte
Acho mais simples e fácil de entender da seguinte maneira:
fonte
Você precisa fazer assim:
fonte