我通过调用ASP.NET Web API在我的客户端(ASP.NET MVC应用程序)中收到此错误。我检查过,Web API正在返回数据。
No MediaTypeFormatter is available to read an object of type
'IEnumerable`1' from content with media type 'text/plain'.
我相信我可以继承DataContractSerializer
并实现我自己的序列化程序,它可以将Content-Type
HTTP标头附加为text/xml
。
但我的问题是:那是必要的吗?
因为如果是,则意味着默认DataContractSerializer
不会设置此基本标头。我想知道微软是否可以抛出这么重要的事情。还有另一种出路吗?
以下是相关的客户端代码:
public ActionResult Index()
{
HttpClient client = new HttpClient();
var response = client.GetAsync("http://localhost:55333/api/bookreview/index").Result;
if (response.IsSuccessStatusCode)
{
IEnumerable<BookReview> reviews = response.Content.ReadAsAsync<IEnumerable<BookReview>>().Result;
return View(reviews);
}
else
{
ModelState.AddModelError("", string.Format("Reason: {0}", response.ReasonPhrase));
return View();
}
}
这是服务器端(Web API)代码:
public class BookReviewController : ApiController
{
[HttpGet]
public IEnumerable<BookReview> Index()
{
try
{
using (var context = new BookReviewEntities())
{
context.ContextOptions.ProxyCreationEnabled = false;
return context.BookReviews.Include("Book.Author");
}
}
catch (Exception ex)
{
var responseMessage = new HttpResponseMessage
{
Content = new StringContent("Couldn't retrieve the list of book reviews."),
ReasonPhrase = ex.Message.Replace('\n', ' ')
};
throw new HttpResponseException(responseMessage);
}
}
}
答案 0 :(得分:4)
我相信(因为我现在没有时间对其进行测试)您需要在传递给HttpResponseException
的responseMessage上显式设置状态代码。通常,HttpResponseException
会为您设置状态代码,但由于您明确提供了响应消息,因此它将使用该状态代码。默认情况下,`HttpResponseMessage的状态代码为200.
所以发生的事情是你在服务器上收到错误,但仍然返回200.这就是为什么你的客户端试图反序列化StringContent生成的text / plain正文,好像它是一个IEnumerable。
您需要设置
responseMessage.StatusCode = HttpStatusCode.InternalServerError
在服务器上的异常处理程序中。
答案 1 :(得分:1)
如果你的WebAPI希望以纯文本形式返回内容,那么只使用ReadAsStringAsync
呢?
response.Content.ReadAsStringAsync().Result;