2010-03-25 9 views
25

Problem:WCF Datacontract, einige Felder haben deserialisieren nicht

ich eine WCF-Dienst eingerichtet habe ein Endpunkt für einen Anruf von einem externen System zu sein. Der Anruf sendet einfaches XML. Ich teste das System, indem ich Anrufe von Fiddler mit dem RequestBuilder in den Dienst sende.

Das Problem ist, dass alle meine Felder mit Ausnahme von zwei Feldern deserialisiert werden. price_retail und price_wholesale.

Was fehlt mir? Alle anderen Felder deserialisieren ohne ein Problem - der Dienst antwortet. Es sind nur diese Felder.

XML Nachricht:

<widget_conclusion> 
    <list_criteria_id>123</list_criteria_id> 
    <list_type>consumer</list_type> 
    <qty>500</qty> 
    <price_retail>50.00</price_retail> 
    <price_wholesale>40.00</price_wholesale> 
    <session_id>123456789</session_id> 
</widget_conclusion> 

Service-Methode:

public string WidgetConclusion(ConclusionMessage message) 
{ 
    var priceRetail = message.PriceRetail; 
} 

Nachrichtenklasse:

[DataContract(Name = "widget_conclusion", Namespace = "")] 
public class ConclusionMessage 
{ 
    [DataMember(Name = "list_criteria_id")] 
    public int CriteriaId { get; set;} 
    [DataMember(Name = "list_type")] 
    public string ListType { get; set; } 
    [DataMember(Name = "qty")] 
    public int ListQuantity { get; set; } 
    [DataMember(Name = "price_retail")] 
    public decimal PriceRetail { get; set; } 
    [DataMember(Name = "price_wholesale")] 
    public decimal PriceWholesale { get; set; } 
    [DataMember(Name = "session_id")] 
    public string SessionId { get; set; } 
} 

Antwort

44

Felder in der falschen Reihenfolge für Ihre Nachricht sind. DataContracts standardmäßig auf Alphabetische Reihenfolge und nicht Reihenfolge der Deklaration; und erwartet, dass XML-Elemente in dieser Reihenfolge ankommen; Out-of-Order-Elemente werden normalerweise verworfen.

Korrigieren Sie entweder Ihren Vertrag, um die richtige Reihenfolge explizit anzugeben (mithilfe der Order-Eigenschaft des DataMemberAttribute), oder stellen Sie sicher, dass Ihr Client sie in der richtigen Reihenfolge sendet.

+1

Gute Antwort. Ich habe beide Möglichkeiten versucht und das Verhalten ist genau, wie Sie beschreiben. Es ist immer eine demütigende Erfahrung, die einfachen Dinge zu vermissen. Ich bin daran interessiert, warum DataContracts Standard in alphabetischer Reihenfolge. Es scheint, dass es deklarativer wäre, die Reihenfolge der Deklaration beizubehalten ... aber ich denke, dass die Lieferung des Attributs Order die deklarativste ist. –

+1

Ja. Ich habe es mir zur Gewohnheit gemacht, die Reihenfolge immer explizit zu deklarieren, macht es später viel einfacher. – tomasr

+6

Gibt es einen anderen Serializer (anders als der antedeluvian XmlSerializer), der dieses knochenharte Verhalten nicht hat? Denn wenn ich diese Art von starrer, extrem strikter Deserialisierung wollte, würde ich nur Binär verwenden. – Pxtl

0

Sie können versuchen, XmlSerializer anstelle von DataContractSerializer zu verwenden. In meinem Fall muss ich Standard-Engine in global.asax-Datei ändern:

var xml = GlobalConfiguration.Configuration.Formatters.XmlFormatter; 
xml.UseXmlSerializer = true; 

dies sorgfältig tun, weil einige XML nicht gültig werden können, zum Beispiel - Namensraum, mit XmlSerializer wie bestimmt werden sollte:

[XmlNamespaceDeclarations] 
private XmlSerializerNamespaces xmlns 
{ 
    get { 
    var xns = new XmlSerializerNamespaces(); 
    xns.Add("i", "http://www.w3.org/2001/XMLSchema-instance"); 
    return xns; 
    }  
    set { } 
} 

Oder Sie können XmlSerializerFormatAtrribute zu Ihrer Klasse (nicht für mich arbeiten). Suchen Sie im URL-Kopf "Manuell zum XmlSerializer wechseln"

Verwandte Themen