2016-04-04 13 views
0

Aşağıdaki verileri bir Web API'sına aktarıyorum. API çağrımıma ulaştığında, verilerin "İstemci" bölümüne sahibim ve "Durum" kabına sahibim, ancak içinde hiçbir bilgisi yok.Seri hale getirilmiş veriler web api'ye aktarılırken eksik veriler

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

ben web API üzerinde bekliyorum sınıfı:

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

sonuç ben eksik

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

olarak gelir? Durum bölümü neden boş?

+0

, Liste denemek ve MyOtherMiniObject bir dize özelliğini koydu. – granadaCoder

cevap

1

Modelinizi süslemek için kullandığınız XmlArrayItem özniteliği, yalnızca XmlSerializer sınıfının anladığı bir şeydir. Varsayılan olarak IIRC, ASP.NET Web API'sı bu serileştiriciyi kullanmaz, bunun yerine DataContractSerializer'u (sırayla XML formatındaki ince taneli kontrolü desteklemez).

Yani ayarları dikkate alınması istiyorsanız bunu işe koşulması zaman doğru seri hale kullanmak için Web API talimat emin olun:

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

kendi özel seri hale ile gelip. İlk önce, aşağıdaki gibi bir model oluşturmanız gerekir.

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

Ardından, aşağıdaki gibi XmlObjectSerializer öğesinden devralınan bir sınıf oluşturun.

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

İhtiyaç duyduğunuz başka bir yöntemi uygulamanız gerekir. Artık WebApiConfig'te aşağıdaki kod satırlarını eklemeniz gerekiyor. Bunun yerine "List " nin

config.Formatters.XmlFormatter.SetSerializer<StatusRequest>(new StatusRequestSerializer()); 
    config.Formatters.XmlFormatter.UseXmlSerializer = true;