Saltar al contenido

No hay MediaTypeFormatter disponible para leer un objeto de tipo ‘Cadena’ del contenido con tipo de medio ‘texto/sin formato’

Luego de de una prolongada selección de información dimos con la solución esta escollo que pueden tener muchos lectores. Te ofrecemos la solución y esperamos que te sea de gran apoyo.

Solución:

Intente usar ReadAsStringAsync() en su lugar.

 var foo = resp.Content.ReadAsStringAsync().Result;

la razon por la cual ReadAsAsync() no funciona es porque ReadAsAsync<> intentará usar uno de los predeterminados MediaTypeFormatter (es decir JsonMediaTypeFormatter, XmlMediaTypeFormatter…) para leer el contenido con content-type de text/plain. Sin embargo, ninguno de los formateadores predeterminados puede leer el text/plain (solo pueden leer application/json, application/xmletc).

Mediante el uso ReadAsStringAsync()el contenido se leerá como string independientemente del tipo de contenido.

O simplemente puedes crear el tuyo propio. MediaTypeFormatter. Yo uso esto para text/html. si agregas text/plain a él, funcionará para usted también:

public class TextMediaTypeFormatter : MediaTypeFormatter

    public TextMediaTypeFormatter()
    
        SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
    

    public override Task ReadFromStreamAsync(Type type, Stream readStream, HttpContent content, IFormatterLogger formatterLogger)
    
        return ReadFromStreamAsync(type, readStream, content, formatterLogger, CancellationToken.None);
    

    public override async Task ReadFromStreamAsync(Type type, Stream readStream, HttpContent content, IFormatterLogger formatterLogger, CancellationToken cancellationToken)
    
        using (var streamReader = new StreamReader(readStream))
        
            return await streamReader.ReadToEndAsync();
        
    

    public override bool CanReadType(Type type)
    
        return type == typeof(string);
    

    public override bool CanWriteType(Type type)
    
        return false;
    


Finalmente tienes que asignar esto a la HttpMethodContext.ResponseFormatter propiedad.

Sé que esta es una pregunta anterior, pero sentí que la respuesta de t3chb0t me llevó al mejor camino y sentí ganas de compartir. Ni siquiera necesita ir tan lejos como para implementar todos los métodos del formateador. Hice lo siguiente para el tipo de contenido “application/vnd.api+json” devuelto por una API que estaba usando:

public class VndApiJsonMediaTypeFormatter : JsonMediaTypeFormatter

    public VndApiJsonMediaTypeFormatter()
    
        SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/vnd.api+json"));
    

Que se puede usar simplemente como lo siguiente:

HttpClient httpClient = new HttpClient("http://api.someaddress.com/");
HttpResponseMessage response = await httpClient.GetAsync("person");

List formatters = new List();
formatters.Add(new System.Net.Http.Formatting.JsonMediaTypeFormatter());
formatters.Add(new VndApiJsonMediaTypeFormatter());

var responseObject = await response.Content.ReadAsAsync(formatters);

Súper simple y funciona exactamente como esperaba.

Si haces scroll puedes encontrar las notas de otros sys admins, tú igualmente tienes la libertad de mostrar el tuyo si dominas el tema.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Respuestas a preguntas comunes sobre programacion y tecnología