डब्ल्यूसीएफ जेनरेट प्रॉक्सी ऑर्डर आश्रित है और सेवा अनुक्रम में नए तत्व जोड़े गए हैं

हमने डब्ल्यूसीएफ और सी # का उपयोग कर मौजूदा एसओएपी वेब सेवा के लिए क्लाइंट बनाया है। हाल ही में, वेब सेवा अपडेट की गई थी और हमारे ग्राहक ने काम करना बंद कर दिया था। जैसा कि मैंने इसे देखा है, इस ब्लॉग पोस्ट में सबसे अच्छी तरह से समझाया गया है - इंटरऑपरेबिलिटी गोटो: एक्सएमएल एलिमेंट्स का ऑर्डर यरोन नवीन द्वारा।

मैं अपने प्रश्न के लिए यरोन का उदाहरण उधार लेगा। मूल रूप से, wsdl इस तरह दिखता था:


 
  
   
   
  
 

डब्ल्यूसीएफ जेनरेट प्रॉक्सी ने स्पष्ट तत्व ऑर्डरिंग का उपयोग किया:

[XmlElement(Order=0)]
public string Elem1
{
...
}

[XmlElement(Order=1)]
public string Elem2
{
...
}

अद्यतन में, प्रकार में एक नया तत्व जोड़ा गया था, लेकिन यह तत्व अनुक्रम के बीच में जोड़ा गया था।


 
  
   
   
   
  
 

मेरी डब्लूसीएफ प्रॉक्सी जो भी तत्व जोड़ा गया था उसके बाद आदेश दिया गया है कि किसी भी तत्व deserialize नहीं कर सकते हैं।

वेब सेवा के प्रदाता ने इस बदलाव को पुराने ग्राहकों के साथ पिछड़ा संगत होने की उम्मीद की थी। जाहिर है, मेरा ग्राहक एकमात्र ऐसा है जिसने काम करना बंद कर दिया।

क्या यह डब्लूएसडीएल में एक तोड़ने वाला बदलाव है?

मौजूदा ग्राहकों को तोड़ने से रोकने के लिए अनुक्रम के अंत में नए तत्व जोड़े जाएंगे? क्या यह पिछड़ा संगत बना देगा?

यदि मैं XmlElement विशेषता पर ऑर्डर पैरामीटर को हटा दूंगा तो क्या मेरे प्रॉक्सी इस तरह के भविष्य के बदलावों के लिए बेहतर तैयार होंगे? अगर मैं आदेश हटा देता हूं तो मैं क्या छोड़ूं?

0
मैंने सवाल थोड़ा सा हल किया। मुझे उम्मीद है कि यह अधिक स्पष्ट है। असल में, मुझे इस पर दूसरी राय चाहिए। मैं सेवा के प्रदाता को स्पष्ट रूप से समझा सकता हूं कि उनका परिवर्तन एक तोड़ने वाला परिवर्तन था (उन्होंने ऐसा नहीं सोचा था)। मैं उन्हें वैकल्पिक परिवर्तन भी देना चाहता हूं जो इस परिवर्तन को तोड़ने में बदलाव से रोकने में मदद कर सकते थे। मुझे इस तरह के बदलावों के लिए बेहतर तरीके से तैयार करने के बारे में कुछ सलाह भी पसंद आएगी। मुझे पता है कि मैं बहुत कुछ मांग रहा हूं, लेकिन किसी भी रचनात्मक सुझाव और प्रतिक्रिया की सराहना की जाती है।
जोड़ा लेखक Michael Levy, स्रोत
बीच में नए एलीमेंट के अलावा आपकी प्रॉक्सी तोड़ दी गई तो यह एक तोड़ने वाला बदलाव था। सटीक सवाल क्या है, अगर यह उचित है?
जोड़ा लेखक flup, स्रोत

2 उत्तर

पिछड़ा संगतता का सबसे अच्छा तरीका जटिलता प्रकार को [डेटाकंट्रैक्ट] और [डेटामेम्बर] विशेषता के साथ-साथ विरासत webservice में [Serializable] के अलावा घोषित करना है। डेटा कंट्रैक्ट के रूप में घोषित करके अपने क्लाइंट को एक उचित deserialized पैरामीटर मिलेगा इससे कोई फर्क नहीं पड़ता कि आपके जटिल प्रकार में कितने नए फ़ील्ड जोड़े गए हैं।

0
जोड़ा
साथ ही डेटामेम्बर का उपयोग करते समय, आप स्पष्ट रूप से ऑर्डर निर्दिष्ट कर सकते हैं
जोड़ा लेखक CharlesAD, स्रोत

हां, यह उनके डब्लूएसडीएल में एक तोड़ने वाला बदलाव है। आप सही हैं, अनुक्रम के अंत में नए तत्व जोड़ना इसे पिछड़ा संगत बना देगा।

If they wanted consumers to accept elements in any order, they should have used instead of . And when they added the new element, it is a required element unless they add a minOccurs='0' attribute to its schema definition to make it optional.

They could also make their schemas more forward-compatible by adding an element to the end of their sequence as a placeholder for future elements.

यदि आप अपनी प्रॉक्सी से ऑर्डर हटाते हैं तो मुख्य समस्या यह है कि यदि वे अपने अनुक्रम में समान नाम वाले तत्वों की पुनरावृत्ति की अनुमति देते हैं:


 
  
   
   
   
  
 

आपके ऑर्डरिंग सूचक के बिना, डब्ल्यूसीएफ नहीं जानता कि कौन सी संपत्ति दोबारा संपत्ति के मानचित्र पर दोहराया जाए। यदि वे अपने एक्सएमएल को .NET या Java जैसे कुछ से उत्पन्न कर रहे हैं, तो यह समस्या होने की संभावना नहीं है क्योंकि वे आम तौर पर एक तत्व के तत्वों को घुमाते हैं जो बाल तत्वों को दोहराते हैं।

Another benefit of using is that it disallows repeating elements of the same name, thereby avoiding this issue. has the "feature" of allowing multiple elements of the same name, differentiated only by their location in the list.

0
जोड़ा
मैंने इसे सत्यापित किया, और साथ ही, मैंने पुराने (.NET 2) वेब संदर्भ के खिलाफ परीक्षण किया, देखें कि यह व्यवहार तब मौजूद था या नहीं। पुरानी वेब संदर्भ-शैली प्रॉक्सी कक्षा में यह समस्या नहीं है। इसलिए विकल्प, उचितता के क्रम में, (1) तत्वों w/ को प्रतिस्थापित करते हैं, यदि आप कर सकते हैं; (2) प्रॉक्सी उत्पन्न करने के लिए विरासत का उपयोग वेब संदर्भ जोड़ें; (3) डब्ल्यूसीएफ का उपयोग करें और "ऑर्डर = 0" के साथ ऑर्डरएट्रिब्यूट को निकालने के लिए जेनरेटेड रेफरेंस सीएस क्लास को मैन्युअल रूप से संपादित करें (प्रति ऑरान डेनिसन के उत्तर की सिफारिश न करें)
जोड़ा लेखक Thiago Silva, स्रोत
एक और अनुवर्ती ..... xsd का उपयोग करने के लिए मेरे wsdl को प्रतिस्थापित करने के बाद: xsd के बजाय सभी: अनुक्रम, मैंने देखा कि घोंसले वाले तत्व जो सरणी थे, सही ढंग से deserialized नहीं थे, और मैं केवल पहली वस्तु प्राप्त कर रहा था और नहीं सरणी। इसलिए, जैसा कि यह खड़ा है, वर्तमान डब्लूएसडीएल फ़ाइल के साथ जो मुझे तीसरी पार्टी द्वारा सौंपी गई है, मैं केवल वैध प्रॉक्सी क्लास बनाने की विरासत "वेब संदर्भ जोड़ें" तरीका का उपयोग कर सकता हूं।
जोड़ा लेखक Thiago Silva, स्रोत