webentwicklung-frage-antwort-db.com.de

Es ist kein MediaTypeFormatter verfügbar, um ein Objekt vom Typ 'String' aus dem Inhalt mit dem Medientyp 'text/plain' zu lesen.

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

50
Renzzs

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.

71
Maggie Ying

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.

0
t3chb0t