wcf डब्ल्यूसीएफ डाटाकंट्रैक्ट, कुछ फ़ील्ड deserialize नहीं है




datacontractserializer (2)

मुसीबत:

मेरे पास एक बाहरी सिस्टम से कॉल के लिए एक डब्ल्यूसीएफ सेवा सेटअप है। कॉल सादा एक्सएमएल भेज रहा है। मैं 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; }
}

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

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


आप DataContractSerializer के बजाय XmlSerializer का उपयोग करने का प्रयास कर सकते हैं। मेरे मामले में, मुझे global.asax फ़ाइल में डिफ़ॉल्ट इंजन को बदलने की आवश्यकता है:

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

इसे सावधानी से करें क्योंकि कुछ एक्सएमएल मान्य नहीं हो सकते हैं, उदाहरण के लिए - एक्सएमएलएसरियललाइज़र के साथ नामस्थानों को इस प्रकार निर्धारित किया जाना चाहिए:

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

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