2009-01-14 4 views
6

मेरे पास एक सी # डब्ल्यूसीएफ आरईएसटी सेवा है जो एक्सएमएल में क्रमबद्ध बुकमार्क के साथ HTTP पोस्ट अनुरोध भेजकर एक बुकमार्क जोड़ने की अनुमति देती है। मैंने सेवा के लिए ऑपरेशन अनुबंध निर्दिष्ट किया है, जो एक्सएमएल उठाता है और मेरे लिए ऑब्जेक्ट स्वचालित रूप से deserialises। मेरी समस्या यह है कि deserialisation केवल सही ढंग से काम करता है अगर अनुरोध में एक्सएमएल तत्व वर्णानुक्रम में दिए गए हैं, और किसी भी तत्व के लिए मान आबादी से बाहर नहीं हैं।क्या डब्लूसीएफ आरईएसटी सेवाएं मनमानी तत्व ऑर्डर के साथ एक्सएमएल संदेशों के deserialisation का समर्थन कर सकते हैं?

This behaviour has been reported elsewhere

मुझे यह असंतोषजनक लगता है; मैं अनावश्यक होने के लिए एक्सएमएल को एक विशिष्ट क्रम में बनाने की आवश्यकता पर विचार करता हूं, और एक प्रमुख सिरदर्द। यह सेवा के सभी ग्राहकों को जोड़ने और संभावित रूप से कठिन समस्याओं का स्रोत डीबग करने की एक प्रमुख आवश्यकता है।

क्या डब्ल्यूसीएफ को XML तत्व ऑर्डर अज्ञेयवादी होने का निर्देश देना संभव है?


स्पष्टीकरण प्रयोजनों के लिए कुछ अधिक जानकारी:

मेरे आपरेशन अनुबंध इस तरह दिखता है:

[OperationContract] 
[WebInvoke(Method="POST", UriTemplate = "/{username}/bookmarks", ResponseFormat = WebMessageFormat.Xml)] 
public void PostBookmark(string username, RestBookmark newBookmark); 

RestMessage इस प्रकार दिखता है:

[DataContract(Name = "Bookmark", Namespace = "")] 
public class RestBookmark 
{ 
    [DataMember] 
    public string BookmarkMd5 { get; set; } 

    [DataMember] 
    public string Url { get; set; } 

    [DataMember] 
    public string UserName { get; set; } 

    [DataMember] 
    public string Title { get; set; } 

    [DataMember] 
    public string Description { get; set; } 
} 

अगर मैं निम्न XML संदेश भेजते हैं, तो केवल RestMessage वस्तु के उपयोगकर्ता नाम संपत्ति से संबंधित जानकारी देगा जब PostBookmark() शुरू हो जाती है:

<?xml version="1.0"?><Bookmark><UserName>nick.street</UserName><Url>http://www.stackoverflow.com</Url><BookmarkMd5>f184eb3347cf94f6ce5f5fc2844e3bdd</BookmarkMd5><Description>Developer Forum</Description><Title>Stack Overflow</Title></Bookmark> 

उत्तर

1

डेटाकंट्रैक्टसेरियलाइज़र को संस्करण और प्रदर्शन दोनों कारणों के लिए तत्वों का कड़ाई से क्रमिक करने की आवश्यकता होती है।

, कुछ विकल्प मैं के बारे में सोच सकते हैं

  1. संदेश निरीक्षक फिर से आदेश AfterReceivedRequest में कच्चे XML तत्वों होने से पहले ही DataContractSerializer द्वारा deserialized है लिखें।

  2. आपकी सेवाओं के लिए XmlSerializer का उपयोग कर।

  3. HTTP कच्चे एक्सएमएल संदेश प्रक्रिया सेवा के बजाय विकसित करें। आप नोड्स के आदेश तो आप में नोड्स alphabetize चाहिए दर्शाने के लिए अपने DataMember विशेषता में Order निर्दिष्ट करने के लिए नहीं जा रहे हैं

  4. एक शब्दकोश के रूप में वस्तु पारित ( अनुशंसित नहीं)

+0

मुझे XMLSerializer का उपयोग करने का विचार पसंद है। –

+0

मदद और स्पष्ट उत्तर के लिए धन्यवाद! –

-1

DataMember विशेषता में 0 को आदेश सेट करने का प्रयास (सभी सदस्यों के लिए) :

[DataMember (नाम = "शीर्षक", आदेश = 0)]

+0

सुझाव के लिए धन्यवाद। इससे दुर्भाग्य से मदद नहीं मिली - ऐसा प्रतीत होता है कि जब कई वस्तुओं में एक ही ऑर्डर होता है तो वे "अनियंत्रित" की बजाय वर्णमाला क्रम में वापस आ जाते हैं। –

0

मैं इस अपने आप को ऐसा करने के लिए प्रयास नहीं किया है, लेकिन मैं एक अनुमान ले लेंगे।

क्या यह आपके डेटाकंट्रैक्ट पर एक [ऑनडिसेरियलाइजिंग] ईवेंट बनाने में मदद करेगा जो deserialization से पहले आग लग जाएगा? उस समय शायद आप एक्सएमएल को फिर से व्यवस्थित कर सकते हैं, हालांकि इसे आदेश देने की आवश्यकता है ताकि deserialization ठीक से काम करेगा।

आप युवल लोवी के प्रोग्रामिंग WCF सेवा 2 संस्करण है, तो उस पृष्ठ 107.

Here's the MSDN help page से शुरू होने वाले कवर है।

+0

ठीक है, जितना अधिक मैं इसे देखता हूं, मुझे यकीन नहीं है कि आप उस बिंदु पर एक्सएमएल में पारित हो सकते हैं, लेकिन हो सकता है कि आप हुक का उपयोग किसी भी तरह से कर सकें ... –

0

अपने एक्सएमएल।

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