2016-04-04 10 views
0

次のデータをWeb APIに渡します。私のAPI呼び出しに到達すると、データの "クライアント"セクションがあり、 "ステータス"コンテナがありますが、情報はありません。ウェブAPIにシリアル化されたデータを渡すときにデータが見つかりません

<Client> 
<ContactNumber>1</ContactNumber> 
<Name>Test Name</Name> 
<ProcessLevel>Complete</ProcessLevel> 
<ResponseLevel>Minimal</ResponseLevel> 
</Client> 
<Status> 
<MyId>010111111</MyId> 
<MyId>010122211</MyId> 
</Status> 

私は、Web APIに期待していたクラス:

public partial class StatusRequest 
{ 
    public StatusRequest() 
    { 
     this.Client = new Client(); 
     this.Status = new List<string>(); 
    } 

    public Client Client { get; set; }  
    [XmlArrayItem("MyId")] 
    public List<string> Status { get; set; } 
} 

結果は、私が何をしないのです

<Client> 
<ContactNumber>1</ContactNumber> 
<Name>Test Name</Name> 
<ProcessLevel>Complete</ProcessLevel> 
<ResponseLevel>Minimal</ResponseLevel> 
</Client> 
<Status></Status> 

ようで来ますか? [ステータス]セクションが空白なのはなぜですか?

+0

、リストを試してみて、MyOtherMiniObject上の文字列プロパティを置きます。 – granadaCoder

答えて

1

モデルを飾るために使用したXmlArrayItem属性は、XmlSerializerクラスだけが理解できるものです。 IIRCの既定の設定では、ASP.NET Web APIはこのシリアライザを使用せず、DataContractSerializer(XML形式の細かい制御をサポートしていません)を使用します。

あなたの設定が考慮されたいのであれば、あなたはそれをブートストラップする場合、適切なシリアライザを使用するようにWeb APIを指示していることを確認してください:

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     ... 
     config.Formatters.XmlFormatter.UseXmlSerializer = true; 
    } 
} 
0

独自のカスタム・シリアライザを思い付きます。 まず、以下のようにモデルを作成する必要があります。

public class StatusRequest 
    { 
     public StatusRequest() 
     { 
      //this.Client = new Client(); 
      this.Status = new List<string>(); 
     } 

     //public Client Client { get; set; } 

     [XmlArray("Status"), XmlArrayItem("MyId")] 
     public List<String> Status { get; set; } 
    } 

次に、以下のようにXmlObjectSerializerから継承したクラスを作成します。

public class StatusRequestSerializer : XmlObjectSerializer 
{ 
    XmlSerializer serializer; 

    public StatusRequestSerializer() 
    { 
     this.serializer = new XmlSerializer(typeof(StatusRequest)); 
    } 

    public override void WriteObject(XmlDictionaryWriter writer, object graph) 
    { 
     var xmlSerializerNamespaces = new XmlSerializerNamespaces(); 
     xmlSerializerNamespaces.Add("", ""); 
     serializer.Serialize(writer, graph, xmlSerializerNamespaces); 
    } 

    public override bool IsStartObject(XmlDictionaryReader reader) 
    { 
     throw new NotImplementedException(); 
    } 

    public override object ReadObject(XmlDictionaryReader reader, bool verifyObjectName) 
    { 
     throw new NotImplementedException(); 
    } 

    public override void WriteEndObject(XmlDictionaryWriter writer) 
    { 
     throw new NotImplementedException(); 
    } 

    public override void WriteObjectContent(XmlDictionaryWriter writer, object graph) 
    { 
     throw new NotImplementedException(); 
    } 

    public override void WriteStartObject(XmlDictionaryWriter writer, object graph) 
    { 
     throw new NotImplementedException(); 
    } 
} 

必要に応じて他の方法を実装する必要があります。 WebApiConfigに以下のコード行を追加する必要があります。代わりに、 "リスト " の

config.Formatters.XmlFormatter.SetSerializer<StatusRequest>(new StatusRequestSerializer()); 
    config.Formatters.XmlFormatter.UseXmlSerializer = true; 
関連する問題