没有 MediaTypeFormatter 可用于从媒体类型为‘ text/print’的内容中读取类型为‘ String’的对象

情况是这样的:

它们是 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;

但是当我运行应用程序时,我会得到下一个错误:

没有 MediaTypeFormatter 可用于读取类型为“ String”的对象 从媒体类型为’文本/纯文本’的内容。

如果我打开 Fiddler 并运行相同的 url,我会看到正确的数据,但是内容类型是文本/纯文本。然而我在 Fiddler 中也看到了我想要的 JSON..。

有没有可能在客户端解决这个问题,还是 Servoy 网络服务?

更新:
使用 HttpWebRequest 代替 HttpResponseMessage 并使用 StreamReader 读取响应..。

137387 次浏览

尝试改用 ReadAsStringAsync ()。

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

ReadAsAsync<string>()无法工作的原因是,ReadAsAsync<>将尝试使用默认的 MediaTypeFormatter之一(即 JsonMediaTypeFormatterXmlMediaTypeFormatter、 ...)来读取 text/plaincontent-type的内容。但是,没有一个默认格式化程序可以读取 text/plain(它们只能读取 application/jsonapplication/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属性。

我知道这是一个老问题,但我觉得从 T3chbt的答案引导我到最好的路径,并感到愿意分享。您甚至不需要实现格式化程序的所有方法。对于我正在使用的 API 返回的内容类型“ 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);

超级简单,和我想的一模一样。