2012-10-19 94 views
10

在使用XML數據和ASP.NET Web API進行POST時,我無法獲得模型綁定的工作。 JSON數據正常工作。ASP.NET Web API - 模型綁定在POST上不支持XML數據

使用全新的Web API項目,這裏是我的模型類:

public class Person 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

public class PostResponse 
{ 
    public string ResponseText { get; set; } 
} 

這是帖子的方法控制器:

public PostResponse Post([FromBody]Person aPerson) 
    { 
     var responseObj = new PostResponse(); 
     if (aPerson == null) 
     { 
      responseObj.ResponseText = "aPerson is null"; 
      return responseObj; 
     } 

     if (aPerson.FirstName == null) 
     { 
      responseObj.ResponseText = "First Name is null"; 
      return responseObj; 
     } 

     responseObj.ResponseText = string.Format("The first name is {0}", aPerson.FirstName); 
     return responseObj; 
    } 

我能夠用JSON成功運行從提琴手:

請求報頭:
User-Agent:Fiddler
Host:localhost:49188
Content-Type:application/json;字符集= UTF-8
的Content-Length:38

請求體:
{ 「姓」: 「湯姆」, 「名字」: 「瓊斯」}

結果:
{ 「的responseText」: 「第一個名字是湯姆」}

當傳遞XML,Person對象是不正確水合:

請求報頭:
的User-Agent:提琴手
主機:本地主機:49188
內容類型:文本/ XML
的Content-Length:79

請求正文:
<人>
        <名字>湯姆< /姓>
        <名字>瓊斯< /姓氏>
< /人>

結果:
< responseText的> aPerson爲空</responseText的>

從我的理解XML應該工作類似於JSON。任何關於我在這裏失蹤的建議?

感謝,
跳過

回答

24

WebApiConfig.cs補充一點:

config.Formatters.XmlFormatter.UseXmlSerializer = true; 

這迫使網絡API,而不是使用的DataContractSerializer的XMLSerializer,並允許您通過原始XML。

否則,您必須通過完全限定datacontract XML即:

<Person xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Test.WebAPI.Controllers"> 
<FirstName>a</FirstName> 
<LastName>b</LastName> 
</Person> 
+0

感謝翻轉。這很好用! – SkipHarris

+0

很高興你還活着,翻轉! :) –

+2

對於任何仍在使用空模型的人來說,找出錯誤的提示只是通過Request.Content.ReadAsStringAsync()來獲取請求內容,並試圖使用XmlSerializer自己反序列化XML。如果出現問題,XmlSerializer不會像Web API那樣只返回null,而是會拋出一個異常,告訴您爲什麼它不能反序列化。就我而言,這就是我發現我的XML聲明聲明瞭UTF-16編碼,而請求本身是UTF-8編碼的。如果沒有自己進行反序列化,這是我從未想到的。 – Bas