¿Cómo se configura el encabezado de tipo de contenido para una solicitud de HttpClient?

Estoy tratando de configurar el Content-Type encabezado de un HttpClient objeto según lo requiera una API a la que estoy llamando.

Intenté configurar el Content-Type como abajo:

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 agregar Content-Type lanza la siguiente excepción:

Nombre de encabezado mal utilizado. Asegúrese de que los encabezados de solicitud se utilicen con HttpRequestMessage, encabezados de respuesta con HttpResponseMessagey encabezados de contenido con HttpContent objetos.

¿Cómo puedo configurar el Content-Type encabezado en un HttpClient ¿solicitud?

preguntado el 21 de mayo de 12 a las 04:05

Puede seguir cómo lo hace HttpWebRequest en .NET Core (usa HttpClient internamente), consulte github.com/dotnet/corefx/blob/master/src/System.Net.Requests/… Método "EnviarSolicitud" -

20 Respuestas

El tipo de contenido es un encabezado del contenido, no de la solicitud, por lo que está fallando. AddWithoutValidation como sugiere 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):

HttpClient client = new HttpClient();
client.BaseAddress = new Uri("http://example.com/");
client.DefaultRequestHeaders
      .Accept
      .Add(new MediaTypeWithQualityHeaderValue("application/json"));//ACCEPT header

HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, "relativeAddress");
request.Content = new StringContent("{\"name\":\"John Doe\",\"age\":33}",
                                    Encoding.UTF8, 
                                    "application/json");//CONTENT-TYPE header

client.SendAsync(request)
      .ContinueWith(responseTask =>
      {
          Console.WriteLine("Response: {0}", responseTask.Result);
      });

Respondido 20 ago 20, 15:08

Alternativamente, Response.Content.Headers funcionará la mayor parte del tiempo. - Juan Gietzen

@AshishJain La mayoría de las respuestas de SO que he visto involucran Response.Content.Headers para ASP.Net Web API tampoco ha funcionado, pero puede configurarlo fácilmente usando HttpContext.Current.Response.ContentType si lo necesitas. - Jerhewet

@jerhewet lo usé de la siguiente manera que funcionó para mí. var content = new StringContent(datos, Codificación.UTF8, "aplicación/json"); - Ashish-BeJovial

Content-Type es una propiedad de un mensaje HTTP con carga útil; no tiene nada que ver con solicitud vs respuesta. - julian reschke

Interesante. Intenté crear un nuevo StringContent con los tres parámetros y no funcionó. Luego, manualmente: request.Content.Headers.Remove("Content-Type") y luego: request.Content.Headers.Add("Content-Type", "application/query+json") y funcionó. Impar. - bill noel

Para los que no vieron el comentario de Johns a la solucion de carlos...

req.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");

contestado el 05 de mayo de 14 a las 16:05

Hizo la diferencia descargar un pdf. Desde el teléfono intentó descargar un HTML. Después de convertir la extensión, el archivo normalmente se codificaba. - mateo defanti

Tuve que lanzar .ToString() al final, pero sí, esto funcionó para una implementación del servicio WCF. - John Meyer

Eventualmente averiguaré qué tipo de objeto "requerido" es... por prueba y error... PERO sería genial demostrarlo. Gracias por su consideración. - granadaCoder

Para que la gente sepa, el uso de MediaTypeHeaderValue devolverá un error si intenta configurar el conjunto de caracteres, así; response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/xml; charset=utf-8"); - Estoy con Israel

El comentario de Johns a la solución de Carlo decía Response.Content.Headers, pero ¿usted está usando req.Content.Headers? es decir, ¿solicitud frente a respuesta? - joedotnot

Si no le importa una pequeña dependencia de la biblioteca, Flurl.Http [Divulgación: soy el autor] hace que esto sea súper simple. Su PostJsonAsync El método se encarga tanto de serializar el contenido como de establecer el content-type encabezado y ReceiveJson deserializa la respuesta. Si el accept Se requiere encabezado, deberá configurarlo usted mismo, pero Flurl también proporciona una forma bastante limpia de hacerlo:

using Flurl.Http;

var result = await "http://example.com/"
    .WithHeader("Accept", "application/json")
    .PostJsonAsync(new { ... })
    .ReceiveJson<TResult>();

Flurl usa HttpClient y Json.NET bajo el capó, y es un PCL, por lo que funcionará en una variedad de plataformas.

PM> Install-Package Flurl.Http

Respondido 08 Oct 20, 11:10

¿Cómo enviar si el contenido es application/x-www-form-urlencoded? - Vlado Pandzic

Lo usé. Logré en < 1 minuto lo que me estaba tomando mucho tiempo descubrir. Gracias por mantener esta biblioteca libre. - Najeeb

intenta usar TryAddWithoutValidation

  var client = new HttpClient();
  client.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json; charset=utf-8");

respondido 19 nov., 15:22

no funciona me da un 'Nombre de encabezado mal utilizado. Asegúrese de que los encabezados de solicitud se utilicen con HttpRequestMessage, los encabezados de respuesta con HttpResponseMessage y los encabezados de contenido con objetos HttpContent.' - Martín Lietz

Aquellos de ustedes que informan que "funciona" o "no funciona", HttpClient es un objeto muy ambiguo en estos días. Informe el nombre completo (espacio) y el ensamblado .dll del que proviene. - granadaCoder

el Misused header name el error se confirma con dotnet core 2.2. Tuve que usar la respuesta de @carlosfigueira stackoverflow.com/a/10679340/2084315. - ps2goat

.Net intenta forzarlo a obedecer ciertos estándares, a saber, que el Content-Type El encabezado solo se puede especificar en solicitudes que tienen contenido (p. ej. POST, PUT, etc). Por lo tanto, como han indicado otros, la forma preferida de establecer el Content-Type el encabezado es a través del HttpContent.Headers.ContentType propiedad.

Dicho esto, ciertas API (como la API de LiquidFiles, a partir de 2016-12-19) requiere configurar el Content-Type cabecera para un GET solicitud. .Net no permitirá configurar este encabezado en la solicitud en sí, incluso usando TryAddWithoutValidation. Además, no puede especificar un Content para la solicitud, incluso si es de longitud cero. La única forma en que parecía poder sortear esto era recurrir a la reflexión. El código (en caso de que alguien más lo necesite) es

var field = typeof(System.Net.Http.Headers.HttpRequestHeaders)
    .GetField("invalidHeaders", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static) 
  ?? typeof(System.Net.Http.Headers.HttpRequestHeaders) 
    .GetField("s_invalidHeaders", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static);
if (field != null)
{
  var invalidFields = (HashSet<string>)field.GetValue(null);
  invalidFields.Remove("Content-Type");
}
_client.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "text/xml");

Edit:

Como se indica en los comentarios, este campo tiene diferentes nombres en diferentes versiones de la dll. En el código fuente en 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.

respondido 31 mar '17, 16:03

Este campo ahora es s_invalidHeaders, por lo que usar lo siguiente garantiza la compatibilidad: var field = typeof(System.Net.Http.Headers.HttpRequestHeaders) .GetField("invalidHeaders", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static) ?? typeof(System.Net.Http.Headers.HttpRequestHeaders) .GetField("s_invalidHeaders", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static); - David Thompson

¡Gracias, gracias, gracias! A veces, mi montura se cuelga abierta y sale baba cuando encuentro una falla en la API de Microsoft. Pude limpiarlo después de ver su publicación muy sencilla. No muy malo.. - Gerard ONeill

Estoy confundido sobre cómo este código podría causar los errores catastróficos que describe. ¿Puede proporcionar más detalles sobre su caso de uso y los errores que está recibiendo? - erdomke

Guau. Aún más sorprendente, que los métodos GET de Asp.net WebApi requieren que el tipo de contenido se especifique explícitamente =( - AlfeG

Holly Molly, no puedo creer que tenga que recurrir a esto. ¿Desde cuándo los desarrolladores de .NET Framework necesitan sostener mi mano en lo que puedo agregar a la sección de encabezado Http? Abominable. - mezcla

Para aquellos que se preocuparon por charset

Tuve un caso muy especial en el que el proveedor de servicios no aceptaba el conjunto 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 de cambiar el subsistema; pasando de HttpClient a cualquier otra cosa, ese algo me vino a la mente ..., ¿por qué no usar la reflexión para vaciar el "juego de caracteres"? ... Y antes de intentarlo, pensé en una manera, "tal vez pueda cambiarlo después de la inicialización", y funcionó.

Así es como puede configurar el encabezado "application/json" exacto sin "; charset=utf-8".

var jsonRequest = JsonSerializeObject(req, options); // Custom function that parse object to string
var stringContent = new StringContent(jsonRequest, Encoding.UTF8, "application/json");
stringContent.Headers.ContentType.CharSet = null;
return stringContent;

Nota: Los programas null el valor siguiente no funcionará y agregará "; charset=utf-8"

return new StringContent(jsonRequest, null, "application/json");

EDITAR

@DesertFoxAZ sugiere que también se puede usar el siguiente código y funciona bien. (No lo probé yo mismo, si funciona la tarifa y le doy crédito en los comentarios)

stringContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");

Respondido 02 ago 20, 07:08

stringContent.Headers.ContentType = new MediaTypeHeaderValue("aplicación/json"); también funciona - DesiertoZorroAZ

Alguna información adicional sobre .NET Core (después de leer la publicación de erdomke sobre cómo configurar un campo privado para proporcionar 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 configurarlo a través de la reflexión, así que pensé en intentar recrear el problema.

Probé el siguiente código usando .Net 4.6:

HttpRequestMessage httpRequest = new HttpRequestMessage(HttpMethod.Get, @"myUrl");
httpRequest.Content = new StringContent(string.Empty, Encoding.UTF8, "application/json");

HttpClient client = new HttpClient();
Task<HttpResponseMessage> response =  client.SendAsync(httpRequest);  //I know I should have used async/await here!
var result = response.Result;

Y, como era de esperar, 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 recibo una excepción. Mi solicitud fue respondida felizmente por mi aplicación de servidor, y se recogió el tipo de contenido.

Me sorprendió gratamente eso, ¡y espero que ayude a alguien!

Respondido el 12 de junio de 17 a las 10:06

Gracias, Jay: no usa el núcleo y usará la respuesta de erdomke. Agradezco saber que se han intentado todas las vías razonables :). - Gerard ONeill

no funciona .net 4 ({"No se puede enviar un cuerpo de contenido con este tipo de verbo."}) - Tarek El Mallah

@TarekEl-Mallah Sí, lea los comentarios en mi respuesta. El objetivo de mi publicación era ilustrar que no funciona en .NET 4, pero sí en .NET core (no son lo mismo). Tendrá que ver la respuesta de erdomeke a la pregunta del OP para poder piratearlo para que funcione en .NET 4. - arrendajo

Llame a AddWithoutValidation en lugar de Add (consulte la sección del este enlace de MSDN).

Alternativamente, supongo que la API que está utilizando realmente solo requiere esto para solicitudes POST o PUT (no solicitudes GET ordinarias). En ese caso, cuando llame HttpClient.PostAsync y pasar en un HttpContent, establezca esto en el Headers propiedad de eso HttpContent objeto.

Respondido 08 ago 13, 19:08

no funciona me da un 'Nombre de encabezado mal utilizado. Asegúrese de que los encabezados de solicitud se utilicen con HttpRequestMessage, los encabezados de respuesta con HttpResponseMessage y los encabezados de contenido con objetos HttpContent.' - Martín Lietz

AddWithoutValidation no existe - KansaiRobot

var content = new JsonContent();
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
content.Headers.ContentType.Parameters.Add(new NameValueHeaderValue("charset", "utf-8"));
content.Headers.ContentType.Parameters.Add(new NameValueHeaderValue("IEEE754Compatible", "true"));

Es todo lo que necesitas.

Con el uso de Newtonsoft.Json, si necesita un contenido como cadena json.

public class JsonContent : HttpContent
   {
    private readonly MemoryStream _stream = new MemoryStream();
    ~JsonContent()
    {
        _stream.Dispose();
    }

    public JsonContent(object value)
    {
        Headers.ContentType = new MediaTypeHeaderValue("application/json");
        using (var contexStream = new MemoryStream())
        using (var jw = new JsonTextWriter(new StreamWriter(contexStream)) { Formatting = Formatting.Indented })
        {
            var serializer = new JsonSerializer();
            serializer.Serialize(jw, value);
            jw.Flush();
            contexStream.Position = 0;
            contexStream.WriteTo(_stream);
        }
        _stream.Position = 0;

    }

    private JsonContent(string content)
    {
        Headers.ContentType = new MediaTypeHeaderValue("application/json");
        using (var contexStream = new MemoryStream())
        using (var sw = new StreamWriter(contexStream))
        {
            sw.Write(content);
            sw.Flush();
            contexStream.Position = 0;
            contexStream.WriteTo(_stream);
        }
        _stream.Position = 0;
    }

    protected override Task SerializeToStreamAsync(Stream stream, TransportContext context)
    {
        return _stream.CopyToAsync(stream);
    }

    protected override bool TryComputeLength(out long length)
    {
        length = _stream.Length;
        return true;
    }

    public static HttpContent FromFile(string filepath)
    {
        var content = File.ReadAllText(filepath);
        return new JsonContent(content);
    }
    public string ToJsonString()
    {
        return Encoding.ASCII.GetString(_stream.GetBuffer(), 0, _stream.GetBuffer().Length).Trim();
    }
}

respondido 21 nov., 18:15

¿Puedes dar una pequeña explicación de lo que hace? - Alejandro

La primera línea falla con CS0144: "No se puede crear una instancia de la clase abstracta o interfaz 'HttpContent'" - Randall Flagg

y entonces HttpMessageHandler handler = new WebRequestHandler(); HttpResponseMessage result; using (var client = (new HttpClient(handler, true))) { result = client.PostAsync(fullUri, content).Result; } - arte24guerra

¡Puedes usar esto, será un trabajo!

HttpRequestMessage msg = new HttpRequestMessage(HttpMethod.Get,"URL");
msg.Content = new StringContent(string.Empty, Encoding.UTF8, "application/json");

HttpResponseMessage response = await _httpClient.SendAsync(msg);
response.EnsureSuccessStatusCode();

string json = await response.Content.ReadAsStringAsync();

Respondido 10 Jul 19, 05:07

Esto solo funciona con .NET Core, no con .NET Framework. - códigoMono

Ok, no es HTTPClient pero si puedes usarlo, WebClient es bastante fácil:

using (var client = new System.Net.WebClient())
 {
    client.Headers.Add("Accept", "application/json");
    client.Headers.Add("Content-Type", "application/json; charset=utf-8");
    client.DownloadString(...);
 }

Respondido 09 Jul 18, 21:07

Tienes que hacerlo así:

    HttpContent httpContent = new StringContent(@"{ the json string }");
    httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));                
    HttpResponseMessage message = client.PostAsync(@"{url}", httpContent).Result;

Respondido 09 ago 19, 19:08

intente usar HttpClientFactory

services.AddSingleton<WebRequestXXX>()
        .AddHttpClient<WebRequestXXX>("ClientX", config =>
        {
           config.BaseAddress = new System.Uri("https://jsonplaceholder.typicode.com");
           config.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
           config.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json; charset=utf-8");
        });

======================

public class WebRequestXXXX
{
    private readonly IHttpClientFactory _httpClientFactory;

    public WebRequestXXXX(IHttpClientFactory httpClientFactory)
    {
        _httpClientFactory = httpClientFactory;
    }

    public List<Posts> GetAllPosts()
    {
        using (var _client = _httpClientFactory.CreateClient("ClientX"))
        {
            var response = _client.GetAsync("/posts").Result;

            if (response.IsSuccessStatusCode)
            {
                var itemString = response.Content.ReadAsStringAsync().Result;
                var itemJson = System.Text.Json.JsonSerializer.Deserialize<List<Posts>>(itemString, 
                    new System.Text.Json.JsonSerializerOptions 
                    {
                        PropertyNameCaseInsensitive = true
                    });

                return itemJson;
            }
            else
            {
                return new List<Posts>();
            }
        }
    }
}

Respondido 28 Feb 21, 22:02

Parece que Microsoft intenta obligar a los desarrolladores a seguir sus estándares, sin siquiera dar opciones o configuraciones para hacer lo contrario, lo cual es realmente una pena, especialmente dado que se trata de un cliente y estamos dictados por los requisitos del lado del servidor, especialmente dado que ¡Los marcos del lado del servidor de Microsoft lo requieren!

Entonces, básicamente, Microsoft trata de forzarnos a tener buenos hábitos cuando se conecta a sus tecnologías de servidor que nos obligan a no tener buenos hábitos...

Si alguien de Microsoft está leyendo esto, arréglenlo...

De cualquier manera, para cualquiera que necesite el encabezado de tipo de contenido para Obtener, etc., mientras que en una versión anterior de .Net es posible usar la respuesta de @erdomke en https://stackoverflow.com/a/41231353/640195 desafortunadamente, esto ya no funciona en las versiones más nuevas de .Net core.

El siguiente código ha sido probado para funcionar con .Net core 3.1 y, según el código fuente en GitHub, parece que también debería funcionar con versiones más nuevas de .Net.

private void FixContentTypeHeaders()
{
    var assembly = typeof(System.Net.Http.Headers.HttpRequestHeaders).Assembly;
    var assemblyTypes = assembly.GetTypes();

    var knownHeaderType = assemblyTypes.FirstOrDefault(n => n.Name == "KnownHeader");
    var headerTypeField = knownHeaderType?
                .GetFields(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)
                .FirstOrDefault(n => n.Name.Contains("HeaderType"));
    if (headerTypeField is null) return;

    var headerTypeFieldType = headerTypeField.FieldType;            
    var newValue = Enum.Parse(headerTypeFieldType, "All");

    var knownHeadersType = assemblyTypes.FirstOrDefault(n => n.Name == "KnownHeaders");
    var contentTypeObj = knownHeadersType.GetFields().FirstOrDefault(n => n.Name == "ContentType").GetValue(null);

    if (contentTypeObj is null) return;

    headerTypeField.SetValue(contentTypeObj, newValue);
}

respondido 03 mar '21, 02:03

¿Por qué es necesaria toda esta reflexión? Es el objeto de contenido el que dicta el tipo de contenido, y puede agregar un objeto de contenido en las solicitudes GET, así como POST, PUT, etc. Si no tiene un objeto de contenido (cuerpo), el tipo de contenido es un encabezado irrelevante. - Llama

@John Hay marcos que incluyen marcos propios de Microsoft que requieren el encabezado incluso para obtener e incluso cuando no hay contenido, no me pregunten por qué ... y por qué su cliente lo elimina cuando su servidor lo espera ... - yoel halb

Supongo que hay una pelea entre los equipos de Microsoft y nosotros somos los monos en el medio... - yoel halb

A menos que el encabezado Content-Length presente un problema, ¿no es mejor simplemente crear un derivado? HttpContent objeto que le permite especificar el encabezado en lugar de hacer toda esta reflexión? - Llama

Obtuve la respuesta con RestSharp:

        private async Task<string> GetAccessTokenAsync()
        {
            var client = new RestClient(_baseURL);

            var request = new RestRequest("auth/v1/login", Method.POST, DataFormat.Json);

            request.AddHeader("Content-Type", "application/json");
            request.AddHeader("x-api-key", _apiKey);
            request.AddHeader("Accept-Language", "br");
            request.AddHeader("x-client-tenant", "1");
        
            ...
        }

Funcionó para mí.

Respondido 20 Abr '21, 20:04

Para aquellos que deseen establecer el tipo de contenido en Json específicamente, pueden usar el método de extensión PostAsJsonAsync.

using System.Net.Http.Json; //this is needed for PostAsJsonAsync to work
//....
HttpClient client = new HttpClient();
HttpResponseMessage response = await
    client.PostAsJsonAsync("http://example.com/" + "relativeAddress",
                new
                {
                    name = "John Doe",
                    age = 33
                });
//Do what you need to do with your response

La ventaja aquí es un código más limpio y puedes evitar json en cadena. Se pueden encontrar más detalles en: https://docs.microsoft.com/en-us/previous-versions/aspnet/hh944339(v=vs.118)

Respondido 18 Jul 21, 15:07

El problema con el que me encuentro es que PostAsJsonAsync no establece el Content-type ¡¡encabezamiento!! - Garr Godofredo

Lo encuentro más simple y fácil de entender de la siguiente manera:

async Task SendPostRequest()
{
    HttpClient client = new HttpClient();
    var requestContent = new StringContent(<content>);
    requestContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
    var response = await client.PostAsync(<url>, requestContent);
    var responseString = await response.Content.ReadAsStringAsync();
}
...

SendPostRequest().Wait();

Respondido el 11 de junio de 19 a las 23:06

Termino teniendo un problema similar. Entonces descubrí que el software PostMan puede generar código al hacer clic en el botón "Código" en la esquina superior izquierda. A partir de eso, podemos ver lo que sucede "bajo el capó" y la llamada HTTP se genera en muchos lenguajes de código; comando curl, C# RestShart, java, nodeJs, ...

Eso me ayudó mucho y, en lugar de usar .Net base HttpClient, terminé usando el paquete nuget RestSharp.

¡Espero que pueda ayudar a alguien más!

Respondido el 18 de Septiembre de 20 a las 17:09

El truco es que puedes configurar todo tipo de encabezados como:

HttpRequestMessage request = new HttpRequestMessage();
request.Headers.Add("Accept-Language", "en");

pero no cualquier encabezado. Por ejemplo:

request.Headers.Add("Content-Type", "application/json");//wrong

generará la excepción en tiempo de ejecución Misused header name. Puede parecer que esto funcionará:

request.Headers.Add(
   HttpRequestHeader.ContentType.ToString(), //useless
   "application/json"
);

pero esto da un encabezado inútil llamado ContentType, sin el guión. Los nombres de los encabezados no distinguen entre mayúsculas y minúsculas, pero sí distinguen mucho los guiones.

Debe declarar la codificación y el tipo del cuerpo al agregar el cuerpo a la parte Contenido de la solicitud http:

string Body = "...";
request.Content = new StringContent(Body, Encoding.UTF8, "application/json");

Solo entonces el encabezado http aplicable se agrega automáticamente a la solicitud:

Content-Type: application/json; charset=utf-8

Fue difícil descubrir esto, con Fiddler, en una máquina sin un servidor proxy. Visual Studio solía tener una herramienta de red donde podía inspeccionar todos los encabezados, pero solo en la versión 2015, no en las versiones más nuevas 2017 o 2022. Si usa el depurador para inspeccionar request.Headers, no encontrará el encabezado agregado automáticamente por StringContent().

Respondido el 05 de enero de 22 a las 13:01

stringContent.Headers.ContentType = new MediaTypeHeaderValue(contentType); capturar

Y 🎉 ¡SÍ! 🎉 ... eso solucionó el problema con la API REST de ATS: ¡SharedKey funciona ahora! 😄 👍 🍻 https://github.com/dotnet/runtime/issues/17036#issuecomment-212046628

respondido 26 nov., 20:10

edite su pregunta, intente explicar el problema y su solución (sin imojis) - fénixstudio

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.