Web API:没有MediaTypeFormatter可用于从媒体类型为“text / plain”的内容中读取“IEnumerable`1”类型的对象

时间:2013-01-10 13:59:23

标签: asp.net asp.net-mvc asp.net-mvc-4 asp.net-web-api

我通过调用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);
            }
        }
    }

2 个答案:

答案 0 :(得分:4)

我相信(因为我现在没有时间对其进行测试)您需要在传递给HttpResponseException的responseMessage上显式设置状态代码。通常,HttpResponseException会为您设置状态代码,但由于您明确提供了响应消息,因此它将使用该状态代码。默认情况下,`HttpResponseMessage的状态代码为200.

所以发生的事情是你在服务器上收到错误,但仍然返回200.这就是为什么你的客户端试图反序列化StringContent生成的text / plain正文,好像它是一个IEnumerable。

您需要设置

responseMessage.StatusCode = HttpStatusCode.InternalServerError

在服务器上的异常处理程序中。

答案 1 :(得分:1)

如果你的WebAPI希望以纯文本形式返回内容,那么只使用ReadAsStringAsync呢?

response.Content.ReadAsStringAsync().Result;