web-dev-qa-db-fra.com

Aucun MediaTypeFormatter n'est disponible pour lire un objet de type "String" dans un contenu de type de média "text/plain"

Voici la situation:

Leur est un service Web externe dans Servoy et je souhaite utiliser ce service dans une application ASP.NET MVC. 

Avec ce code, je tente d'obtenir les données du service:

HttpResponseMessage resp = client.GetAsync("http://localhost:8080/servoy-service/iTechWebService/axws/shop/_authenticate/mp/112818142456/82cf1988197027955a679467c309274c4b").Result;
resp.EnsureSuccessStatusCode();

var foo = resp.Content.ReadAsAsync<string>().Result;

mais quand je lance l'application, j'obtiens l'erreur suivante:

Aucun MediaTypeFormatter n'est disponible pour lire un objet de type 'String' du contenu avec le type de média 'text/plain'.

Si j'ouvre Fiddler et exécute la même URL, je vois les bonnes données mais le type de contenu est text/plain. Cependant, je vois dans Fiddler aussi le JSON que je veux ...

Est-il possible de résoudre ce problème côté client ou s'agit-il du service Web Servoy?

Mettre à jour:
Utilisé HttpWebRequest au lieu de HttpResponseMessage et lire la réponse avec StreamReader ...

50
Renzzs

Essayez d'utiliser ReadAsStringAsync () à la place.

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

La raison pour laquelle ReadAsAsync<string>() ne fonctionne pas est que ReadAsAsync<> essayera d'utiliser l'une des valeurs par défaut MediaTypeFormatter (c'est-à-dire JsonMediaTypeFormatter, XmlMediaTypeFormatter, ...) pour lire le contenu avec content-type de text/plain. Cependant, aucun des formateurs par défaut ne peut lire le text/plain (ils ne peuvent lire que application/json, application/xml, etc.).

En utilisant ReadAsStringAsync(), le contenu sera lu en tant que chaîne, quel que soit le type de contenu.

71
Maggie Ying

Ou vous pouvez simplement créer votre propre MediaTypeFormatter. J'utilise ceci pour text/html. Si vous ajoutez text/plain, cela fonctionnera pour vous aussi:

public class TextMediaTypeFormatter : MediaTypeFormatter
{
    public TextMediaTypeFormatter()
    {
        SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
    }

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

    public override async Task<object> 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;
    }
}

Enfin, vous devez affecter cela à la propriété HttpMethodContext.ResponseFormatter.

0
t3chb0t