72

これは状況です:

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

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

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で応答を読み取ります...

4

3 に答える 3

125

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

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

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

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

于 2012-10-03T23:04:09.753 に答える
5

これは古い質問であることは承知していますが、t3chb0tからの回答が私を最善の道に導き、共有したいと感じました。フォーマッタのメソッドをすべて実装する必要さえありません。使用していた API によって返される content-type "application/vnd.api+json" に対して次のことを行いました。

public class VndApiJsonMediaTypeFormatter : JsonMediaTypeFormatter
{
    public VndApiJsonMediaTypeFormatter()
    {
        SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/vnd.api+json"));
    }
}

次のように簡単に使用できます。

HttpClient httpClient = new HttpClient("http://api.someaddress.com/");
HttpResponseMessage response = await httpClient.GetAsync("person");

List<System.Net.Http.Formatting.MediaTypeFormatter> formatters = new List<System.Net.Http.Formatting.MediaTypeFormatter>();
formatters.Add(new System.Net.Http.Formatting.JsonMediaTypeFormatter());
formatters.Add(new VndApiJsonMediaTypeFormatter());

var responseObject = await response.Content.ReadAsAsync<Person>(formatters);

非常にシンプルで、期待どおりに機能します。

于 2020-08-08T17:33:42.460 に答える