これが状況です:
彼らは 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で応答を読み取りました...
代わりにReadAsStringAsync()を使用してみてください。
var foo = resp.Content.ReadAsStringAsync().Result;
ReadAsAsync<string>()
が機能しない理由は、ReadAsAsync<>
がデフォルトのMediaTypeFormatter
(つまりJsonMediaTypeFormatter
、XmlMediaTypeFormatter
、...のいずれかを使用しようとするためです。 )content-type
のtext/plain
でコンテンツを読み取ります。ただし、デフォルトのフォーマッタはいずれもtext/plain
を読み取ることができません(application/json
、application/xml
などのみを読み取ることができます)。
ReadAsStringAsync()
を使用すると、コンテンツはコンテンツタイプに関係なく文字列として読み取られます。
または、独自の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
プロパティに割り当てる必要があります。