Estoy tratando de establecer el Content-Type
encabezado de un HttpClient
objeto como lo requiere una API a la que estoy llamando.
Intenté configurar lo Content-Type
siguiente a continuación:
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");
// ...
}
Me permite agregar el Accept
encabezado pero cuando trato de agregarlo Content-Type
arroja la siguiente excepción:
Nombre de encabezado mal utilizado. Asegúrese de utilizar encabezados de solicitud con
HttpRequestMessage
encabezados de respuestaHttpResponseMessage
y encabezados de contenido conHttpContent
objetos.
¿Cómo puedo configurar el Content-Type
encabezado en una HttpClient
solicitud?
Respuestas:
El tipo de contenido es un encabezado del contenido, no de la solicitud, por lo que esto está fallando.
AddWithoutValidation
según lo sugerido por Robert Levy puede funcionar, pero también puede establecer el tipo de contenido al crear el contenido de la solicitud en sí (tenga en cuenta que el fragmento de código agrega "application / json" en dos lugares: para los encabezados Aceptar y Tipo de contenido):fuente
Response.Content.Headers
funcionará la mayor parte del tiempo.Response.Content.Headers
para la API web ASP.Net tampoco han funcionado, pero puede configurarlas fácilmenteHttpContext.Current.Response.ContentType
si lo necesita.Para aquellos que no vieron el comentario de Johns a la solución de Carlos ...
fuente
response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/xml; charset=utf-8");
Si no le importa una pequeña dependencia de la biblioteca, Flurl.Http [revelación: soy el autor] lo hace súper simple. Su
PostJsonAsync
método se encarga tanto de serializar el contenido como de configurar elcontent-type
encabezado, yReceiveJson
deserializa la respuesta. Siaccept
se requiere el encabezado, deberá configurarlo usted mismo, pero Flurl proporciona una forma bastante limpia de hacerlo también:Flurl usa HttpClient y Json.NET bajo el capó, y es una PCL, por lo que funcionará en una variedad de plataformas.
fuente
intenta usar TryAddWithoutValidation
fuente
Misused header name
error se confirma con dotnet core 2.2. Tuve que usar la respuesta de @ carlosfigueira stackoverflow.com/a/10679340/2084315 ..NET intenta obligarlo a obedecer ciertas normas, a saber, que la
Content-Type
cabecera sólo se puede especificar en las solicitudes que tienen contenido (por ejemploPOST
,PUT
, etc.). Por lo tanto, como otros han indicado, la forma preferida de establecer elContent-Type
encabezado es a través de laHttpContent.Headers.ContentType
propiedad.Dicho esto, ciertas API (como la API LiquidFiles , a partir del 2016-12-19) requieren configurar el
Content-Type
encabezado para unaGET
solicitud. .Net no permitirá configurar este encabezado en la solicitud en sí, incluso utilizandoTryAddWithoutValidation
. Además, no puede especificar unContent
para la solicitud, incluso si es de longitud cero. La única forma en que podía evitar esto era recurrir a la reflexión. El código (en caso de que alguien más lo necesite) esEditar:
Como se señaló en los comentarios, este campo tiene diferentes nombres en diferentes versiones de la dll. En el código fuente de GitHub , el campo se llama actualmente
s_invalidHeaders
. El ejemplo se ha modificado para dar cuenta de esto según la sugerencia de @David Thompson.fuente
Alguna información adicional sobre .NET Core (después de leer la publicación de erdomke sobre la configuración de un campo privado para suministrar el tipo de contenido en una solicitud que no tiene contenido) ...
Después de depurar mi código, no puedo ver el campo privado para establecer mediante reflexión, así que pensé en intentar recrear el problema.
He intentado el siguiente código usando .Net 4.6:
Y, como se esperaba, obtengo una excepción agregada con el contenido
"Cannot send a content-body with this verb-type."
Sin embargo, si hago lo mismo con .NET Core (1.1), no obtengo una excepción. Mi solicitud fue respondida felizmente por mi aplicación de servidor, y el tipo de contenido fue recogido.
Me sorprendió gratamente eso, ¡y espero que ayude a alguien!
fuente
Llame en
AddWithoutValidation
lugar deAdd
(vea este enlace de MSDN ).Alternativamente, supongo que la API que está utilizando realmente solo requiere esto para las solicitudes POST o PUT (no las solicitudes GET ordinarias). En ese caso, cuando llame
HttpClient.PostAsync
y pase unHttpContent
, establezca esto en laHeaders
propiedad de eseHttpContent
objeto.fuente
Para aquellos que tuvieron problemas con
charset
Tuve un caso muy especial de que el proveedor de servicios no aceptó el juego de caracteres, y se niegan a cambiar la subestructura para permitirlo ... Desafortunadamente, HttpClient estaba configurando el encabezado automáticamente a través de StringContent, y no importa si pasa nulo o Encoding.UTF8, siempre establecerá el juego de caracteres ...
Hoy estaba al borde para cambiar el subsistema; pasando de HttpClient a cualquier otra cosa, ese algo vino a mi mente ..., ¿por qué no usar la reflexión para vaciar el "juego de caracteres"? ... Y antes de intentarlo, pensé en una forma, "tal vez pueda cambiarlo después de la inicialización", y eso funcionó.
Así es como puede configurar el encabezado exacto "application / json" sin "; charset = utf-8".
Nota: El
null
valor siguiente no funcionará, y agregue "; charset = utf-8"EDITAR
@DesertFoxAZ sugiere que también se puede usar el siguiente código y funciona bien. (no lo probé yo mismo)
fuente
Es todo lo que necesitas.
Con el uso de Newtonsoft.Json, si necesita un contenido como cadena json.
fuente
HttpMessageHandler handler = new WebRequestHandler(); HttpResponseMessage result; using (var client = (new HttpClient(handler, true))) { result = client.PostAsync(fullUri, content).Result; }
Ok, no es HTTPClient pero si puedes usarlo, WebClient es bastante fácil:
fuente
¡Puedes usar esto, será trabajo!
fuente
Lo encuentro más simple y fácil de entender de la siguiente manera:
fuente
Necesitas hacerlo así:
fuente