2010-03-25 15 views
25

समस्या:WCF Datacontract, कुछ क्षेत्रों deserialize नहीं है

मैं एक बाहरी प्रणाली से एक कॉल के लिए एक अंत बिंदु होने के लिए एक WCF सेवा सेटअप किया है। कॉल सादा एक्सएमएल भेज रहा है। मैं RequestBuilder का उपयोग कर फिडलर से सेवा में कॉल भेजकर सिस्टम का परीक्षण कर रहा हूं।

मुद्दा यह है कि मेरे सभी क्षेत्रों को दो क्षेत्रों के अपवाद के साथ deserialized किया जा रहा है। price_retail और price_wholesale

मुझे क्या याद आ रही है? अन्य सभी फ़ील्ड बिना किसी मुद्दे के deserialize - सेवा जवाब देता है। यह सिर्फ इन क्षेत्रों में है।

एक्सएमएल संदेश:

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

सेवा विधि:

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

संदेश वर्ग:

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

उत्तर

44

फील्ड्स अपने संदेश के लिए गलत क्रम में हैं। डेटाकंट्रैक्ट्स वर्णमाला क्रम में डिफ़ॉल्ट और घोषणा के आदेश के लिए डिफ़ॉल्ट नहीं है; और एक्सएमएल तत्वों को उस क्रम में आने की उम्मीद है; आदेश तत्वों से बाहर आमतौर पर त्याग दिया जाता है।

या तो सही आदेश निर्दिष्ट करने के लिए अपने अनुबंध को ठीक करें (डेटामेम्बरएट्रिब्यूट की ऑर्डर प्रॉपर्टी का उपयोग करके) या सुनिश्चित करें कि आपका ग्राहक उन्हें सही में भेजता है।

+1

अच्छा उत्तर। मैंने दोनों तरीकों की कोशिश की और व्यवहार बिल्कुल ठीक है कि आप कैसे वर्णन करते हैं। सरल चीजों को याद करने के लिए यह हमेशा एक नम्र अनुभव है। मुझे दिलचस्पी है कि DataContracts वर्णमाला क्रम में डिफ़ॉल्ट क्यों है। ऐसा लगता है कि यह घोषणा के आदेश को बनाए रखने के लिए और अधिक घोषणात्मक होगा ... लेकिन मुझे लगता है कि आदेश विशेषता की आपूर्ति सबसे अधिक घोषणात्मक है। –

+1

हां। मैंने इसे हमेशा आदेश को स्पष्ट रूप से घोषित करने का अभ्यास किया है, बाद में चीजों को बहुत आसान बनाता है। – tomasr

+6

क्या कोई अन्य धारावाहिक (एंटेडेल्यूवियन एक्सएमएलसेरियलाइज़र के अलावा) है जिसमें इस हड्डी के सिर का व्यवहार नहीं है? क्योंकि अगर मैं उस तरह के कठोर हाइपर-सख्त deserialization चाहता था, मैं बस बाइनरी का उपयोग करेंगे। – Pxtl

0

आप DataContractSerializer के बजाय XmlSerializer का उपयोग करने का प्रयास कर सकते हैं।

: -, नामस्थान XmlSerializer के साथ की तरह निर्धारित किया जाना चाहिए

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

क्या यह ध्यान से, क्योंकि कुछ एक्सएमएल मान्य नहीं हो सकता है, उदाहरण के लिए: मेरे मामले में, मैं Global.asax फ़ाइल में डिफ़ॉल्ट इंजन को बदलने की जरूरत

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

या आप XmlSerializerFormatAtrribute को कक्षा में सेट कर सकते हैं (मेरे लिए काम नहीं करते)। यूआरएल सिर में देखें "मैन्युअल रूप से XmlSerializer पर स्विचिंग"

संबंधित मुद्दे