2013-03-05 48 views
2

WebAPI正在忽略傳入請求上的Accept:標頭,並且似乎總是將我的POCO對象序列化爲JSON。我使用WizTools RestClient測試API調用,並設置請求的HTTP標頭:爲什麼WebAPI不會將我的POCO作爲XML返回?

GET /api/people/evh123 
Accept: application/xml 

如果我修改我的控制器返回string[]或其他一些本機類型,我得到XML預期。我見過幾個人建議增加這一行我Application_Start()方法:

GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true; 

但對我來說這並沒有什麼不同。

我的API控制器:

using System.Web.Http; 
using Spyglass.Api.Entities; 

namespace Spyglass.Api.Controllers { 
    public class PeopleController : ApiController { 

     public Person Get(string personId) { 
      var member = new Person(personId) { FullName = "Eddie van Halen" }; 
      return (member); 
     } 
    } 
} 

我的路由配置:

using System.Web.Http; 

namespace Spyglass.Api { 
    public static class WebApiConfig { 
     public static void Register(HttpConfiguration config) { 
      config.Routes.MapHttpRoute(
       name: "PeopleApi", 
       routeTemplate: "api/people/{personId}/{controller}/{id}", 
       defaults: new {id = RouteParameter.Optional, controller = "People"} 
       ); 
     } 
    } 
} 

我的POCO:

namespace Spyglass.Api.Entities { 
    public class Person { 
     public string PersonId { get; set; } 
     public string FullName { get; set; } 

     public Person(string personId) { 
      this.PersonId = personId; 
     } 
    } 
} 

我缺少某種自定義序列化的配置爲我的POCO?沒有任何通常會導致XML序列化程序頭痛的循環引用或複雜類型......任何想法?

+0

下面的答案可能是正確的(即構造函數);然而,我想指出這個答案,其中涵蓋了其他潛在的問題,並建議修補其他人可能會出現http://stackoverflow.com/questions/11804301/webapi-not-returning-xml-even-with-correct-accepts - 標題 – 2013-03-05 20:54:38

回答

-2

您可以嘗試從global.asx.cs中刪除json格式器;

GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.JsonFormatter); 

這將只留下XML格式化程序。

+0

如果我添加該行,我得到一個406不可接受的響應。 – 2013-03-05 12:25:08

+0

您正在看到一個406,因爲在內容協商期間,每個格式化程序都會被詢問是否可以寫入特定類型。我這種情況下XmlMediaTypeFormatter的CanWriteType提到假,因此你看到這個問題。你可以通過做類似「XmlMediaTypeFormatter frmtr = new XmlMediaTypeFormatter(); bool canWriteType = frmtr.CanWritetype(typeof(Person));」 – 2013-03-05 16:45:34

6

您需要裝飾使用[DataContract]你的對象和[數據成員]屬性

[DataContract] 
public class Person 
{ 

    [DataMember] 
    public string PersonId { get; set; } 

    [DataMember] 
    public string FullName { get; set; } 

    public Person(string id) 
    { 
     PersonId = id; 
    } 
} 

另外,請確保您的波蘇斯有一個默認的,無參數構造函數。 這是DataContractSerializer的限制。您也可以使用不同的序列化程序。

+0

Piotr是對的,您需要添加一個默認的無參數構造函數或者添加DataContract/DataMember屬性來使序列化器工作。 – 2013-03-05 16:31:46

+0

我在三年後跳了進去,但這個問題剛剛發生在我身上。我很好地返回了JSON,但是當我嘗試返回XML時,我只是得到一個空文檔。裝飾模型[DataContract]和[DataMember]解決了它。 – weloytty 2016-06-14 22:23:28

相關問題