Estoy tratando de establecer el Content-Typeencabezado de un HttpClientobjeto como lo requiere una API a la que estoy llamando.
Intenté configurar lo Content-Typesiguiente 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 Acceptencabezado pero cuando trato de agregarlo Content-Typearroja la siguiente excepción:
Nombre de encabezado mal utilizado. Asegúrese de utilizar encabezados de solicitud con
HttpRequestMessageencabezados de respuestaHttpResponseMessagey encabezados de contenido conHttpContentobjetos.
¿Cómo puedo configurar el Content-Typeencabezado en una HttpClientsolicitud?

Respuestas:
El tipo de contenido es un encabezado del contenido, no de la solicitud, por lo que esto está fallando.
AddWithoutValidationsegú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.Headersfuncionará la mayor parte del tiempo.Response.Content.Headerspara la API web ASP.Net tampoco han funcionado, pero puede configurarlas fácilmenteHttpContext.Current.Response.ContentTypesi 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
PostJsonAsyncmétodo se encarga tanto de serializar el contenido como de configurar elcontent-typeencabezado, yReceiveJsondeserializa la respuesta. Siacceptse 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 nameerror 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-Typecabecera 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-Typeencabezado es a través de laHttpContent.Headers.ContentTypepropiedad.Dicho esto, ciertas API (como la API LiquidFiles , a partir del 2016-12-19) requieren configurar el
Content-Typeencabezado para unaGETsolicitud. .Net no permitirá configurar este encabezado en la solicitud en sí, incluso utilizandoTryAddWithoutValidation. Además, no puede especificar unContentpara 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
AddWithoutValidationlugar 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.PostAsyncy pase unHttpContent, establezca esto en laHeaderspropiedad de eseHttpContentobjeto.fuente
Para aquellos que tuvieron problemas con
charsetTuve 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
nullvalor 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