2012-10-19 13 views
10

ASP.NET Web APIでXMLデータを使用してPOSTを実行しているときに、モデルバインディングを機能させることができませんでした。 JSONデータは正常に動作します。ブランドの新しいWeb APIプロジェクトを使用してASP.NET Web API - モデルのバインディングがPOSTのXMLデータで機能しない

、ここに私のモデルクラスは次のとおりです。私は、JSONで正常にそれを実行することができる午前

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

:ここ

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

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

は、コントローラの私のPOSTメソッドでありますフィドラーから:

リクエストヘッダ:
ユーザエージェント:Fiddler
ホスト:localhost:49188
コンテンツタイプ:application/json; charset = UTF-8
のContent-Length:38

リクエストボディ:
{ "姓": "トム"、 "氏名": "ジョーンズ"}

結果:

XMLに渡すときは、Personオブジェクトが正しく水和されていません:{ "ResponseTextは、" "最初の名前はトムです"}の

リクエストヘッダ:
のUser-Agent:フィドラー
ホスト:localhostを:49188
のContent-Type:text/xmlで
のContent-Length:79

リクエストボディ:
<人>
        <姓>トム< /姓
        <姓>ジョーンズ< /姓>
< /人>

結果>:
<ResponseText> aPersonがnull </ResponseText >

私はXMLがJSONと同じように動作するはずだと思ったからです。私がここで紛失していることに関する提案はありますか?

config.Formatters.XmlFormatter.UseXmlSerializer = true; 

代わりにDataContractSerializerのにXmlSerializerを使用するには、この強制的なウェブAPIを、あなたが生のXMLを渡すことができます:

おかげで、
スキップ

答えて

24

はあなたのWebApiConfig.csでこれを追加します。

は、そうでなければ、あなたは完全に渡すの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を使用して自分自身をデシリアライズしようとしていることです。何かが間違っている場合、Web APIのようにnullを返すだけでなく、XmlSerializerは、逆シリアル化できない理由を示す例外をスローします。私の場合、これは、リクエスト自体がUTF-8でエンコードされている間、XML宣言でUTF-16エンコーディングが指定されていることが分かりました。これは自分で脱直列化を行うだけでは決して想像できないものです。 – Bas

関連する問題