Dies ist die Situation:
Es gibt einen externen Webservice in Servoy und ich möchte diesen Service in einer ASP.NET MVC-Anwendung verwenden.
Mit diesem Code versuche ich, die Daten vom Dienst abzurufen:
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;
aber wenn ich die Anwendung starte, erhalte ich den nächsten Fehler:
Es ist kein MediaTypeFormatter verfügbar, um ein Objekt vom Typ 'String' .__ zu lesen. von Inhalten mit Medientyp 'Text/Plain'.
Wenn ich Fiddler öffne und dieselbe URL verwende, sehe ich die richtigen Daten, aber der Inhaltstyp ist text/plain. Allerdings sehe ich in Fiddler auch die JSON, die ich will ...
Kann man dies auf Kundenseite lösen oder ist es der Servoy Webservice?
Update:
Verwendete HttpWebRequest anstelle von HttpResponseMessage und las die Antwort mit StreamReader ...
Versuchen Sie stattdessen ReadAsStringAsync () zu verwenden.
var foo = resp.Content.ReadAsStringAsync().Result;
Der Grund, warum ReadAsAsync<string>()
nicht funktioniert, ist, dass ReadAsAsync<>
versucht, einen der Standardwerte MediaTypeFormatter
(d. H. JsonMediaTypeFormatter
, XmlMediaTypeFormatter
, ...) zu verwenden, um den Inhalt mit content-type
von text/plain
zu lesen. Keiner der Standard-Formatierer kann jedoch text/plain
lesen (sie können nur application/json
, application/xml
usw. lesen).
Durch die Verwendung von ReadAsStringAsync()
wird der Inhalt unabhängig vom Inhaltstyp als Zeichenfolge gelesen.
Oder Sie können einfach Ihre eigene MediaTypeFormatter
erstellen. Ich benutze dies für text/html
. Wenn Sie text/plain
hinzufügen, funktioniert es auch für Sie:
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;
}
}
Zum Schluss müssen Sie dies der HttpMethodContext.ResponseFormatter
-Eigenschaft zuordnen.