2016-04-04 6 views
0

Ich übermittle die folgenden Daten an eine Web-API. Wenn es zu meinem API-Aufruf kommt, habe ich den Abschnitt "Client" der Daten und ich habe den Container "Status", aber es enthält keine Informationen.Daten fehlen, wenn serialisierte Daten an Web-API übergeben werden

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

Die Klasse, die ich auf dem Web-API erwarten:

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

Die Ergebnisse kommen in als

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

Was bin ich? Warum ist der Statusbereich leer?

+0

Statt "List ", versuchen Sie List und eine String-Eigenschaft auf MyOtherMiniObject setzen. – granadaCoder

Antwort

1

Das Attribut XmlArrayItem, das Sie verwendet haben, um Ihr Modell zu dekorieren, ist etwas, das nur die Klasse XmlSerializer versteht. IIRC standardmäßig ASP.NET-Web-API verwendet nicht diesen Serializer, sondern die DataContractSerializer (die wiederum solche feinkörnige Kontrolle über das XML-Format nicht unterstützt).

Also, wenn Sie Ihre Einstellungen wollen in Betracht gezogen werden sicherstellen, dass Sie den Web-API angewiesen haben, den richtigen Serializer zu verwenden, wenn es Bootstrapping:

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

Sie kommen mit Ihrem eigenen Serializer. Zunächst müssen Sie ein Modell wie unten beschrieben erstellen.

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

Dann erstellen Sie eine Klasse, die wie folgt von XmlObjectSerializer geerbt wird.

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

Sie müssen andere Methoden implementieren, wie Sie benötigen. Jetzt müssen Sie die folgenden Codezeilen in WebApiConfig hinzufügen.

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