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 ...
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.
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
.