web-dev-qa-db-ja.com

メディアタイプ「text / plain」のコンテンツからタイプ「String」のオブジェクトを読み取るために使用できるMediaTypeFormatterがありません

これが状況です:

彼らは Servoy の外部Webサービスであり、ASP.NET MVCアプリケーションでこのサービスを使用したいと思います。

このコードを使用して、サービスからデータを取得しようとします。

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;

しかし、アプリケーションを実行すると、次のエラーが発生します。

メディアタイプ「text/plain」のコンテンツからタイプ「String」のオブジェクトを読み取るためのMediaTypeFormatterはありません。

Fiddlerを開いて同じURLを実行すると、正しいデータが表示されますが、コンテンツタイプはtext/plainです。ただし、Fiddlerには、必要なJSONも表示されます...

クライアント側でこれを解決することは可能ですか、それともServoy Webサービスですか?

更新:
HttpResponseMessageの代わりにHttpWebRequestを使用し、StreamReaderで応答を読み取りました...

55
Renzzs

代わりにReadAsStringAsync()を使用してみてください。

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

ReadAsAsync<string>()が機能しない理由は、ReadAsAsync<>がデフォルトのMediaTypeFormatter(つまりJsonMediaTypeFormatterXmlMediaTypeFormatter、...のいずれかを使用しようとするためです。 )content-typetext/plainでコンテンツを読み取ります。ただし、デフォルトのフォーマッタはいずれもtext/plainを読み取ることができません(application/jsonapplication/xmlなどのみを読み取ることができます)。

ReadAsStringAsync()を使用すると、コンテンツはコンテンツタイプに関係なく文字列として読み取られます。

87
Maggie Ying

または、独自のMediaTypeFormatterを作成することもできます。これをtext/htmlに使用します。 text/plainを追加すると、それも機能します:

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;
    }
}

最後に、これをHttpMethodContext.ResponseFormatterプロパティに割り当てる必要があります。

2
t3chb0t