2

我通过调用我的 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-TypeHTTP 标头附加为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);
            }
        }
    }
4

2 回答 2

4

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

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

你需要设置

responseMessage.StatusCode = HttpStatusCode.InternalServerError

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

于 2013-01-10T19:43:10.120 回答
1

ReadAsStringAsync如果您的 WebAPI 期望以纯文本形式返回内容,那么如何使用?

response.Content.ReadAsStringAsync().Result;
于 2013-01-10T17:43:15.537 回答