2013-01-10 588 views
2

我從客戶端(ASP.NET MVC應用程序)我的ASP.NET Web API。我檢查並且Web API正在返回數據。Web API:沒有MediaTypeFormatter可用於從媒體類型爲'text/plain'的內容中讀取'IEnumerable`1'類型的對象。

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(); 
      } 
     } 

而這裏的服務器端(網頁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); 
      } 
     } 
    } 
+1

您是否嘗試過爲您正在製作的http請求設置內容類型? –

+0

嘗試將返回類型從IEnumerable切換到列表 – frictionlesspulley

+0

它看起來像是 - 你見過http://stackoverflow.com/questions/10428177/asp-net-mvc4-webapi-and-posting-xml-data –

回答

1

如何只使用ReadAsStringAsync如果您的WebAPI期待以純文本形式返回內容?

response.Content.ReadAsStringAsync().Result; 
+0

OP僅在服務器出現故障時纔會出現字符串。我不認爲你的上面的行會實際編譯。 –

4

我相信,(因爲我沒有時間,現在來測試它),你需要明確設置的Status Code上要傳遞到HttpResponseException的responseMessage。通常,HttpResponseException將爲您設置狀態碼,但由於您明確提供了響應消息,因此它將使用該狀態碼。默認情況下,`HttpResponseMessage有一個200的狀態代碼。

所以發生了什麼是你在服務器上得到一個錯誤,但仍然返回一個200.這就是爲什麼你的客戶端試圖反序列化text/plain body由StringContent生成,就好像它是一個IEnumerable。

您需要設置

responseMessage.StatusCode = HttpStatusCode.InternalServerError 

在服務器上的異常處理程序。

相關問題