2009-07-22 16 views
16

असल में, मेरे पास सर्वर एक्स और वाई के साथ सर्वर-साइड प्रकार "फू" है। जब भी मैं विजुअल स्टूडियो के "सर्वर संदर्भ जोड़ें" का उपयोग करता हूं तो मुझे डब्लूएसडीएल और जेनरेट प्रॉक्सी दोनों सदस्यों को "फ़ील्ड" शब्द जोड़ते हैं और पहले अक्षर के आवरण को बदलें। आईई, "एक्स" और "वाई" का नाम बदलकर "एक्सफिल्ड" और "वाईफिल्ड" रखा गया है। कुछ पता है कि ऐसा क्यों हो रहा है? मैं पैटर्न को समझ नहीं सकता।डब्ल्यूसीएफ कभी-कभी उत्पन्न प्रॉक्सी प्रकारों के अंत में "फ़ील्ड" क्यों जोड़ता है?

विवरण - मेरे पास एक विरासत एएसएमएक्स वेब सेवा है जो "फू" प्रकार का खुलासा करती है। मैंने एक नई डब्ल्यूसीएफ सेवा बनाई जो कि पुरानी वेब सेवा के चारों ओर एक रैपर है - नई सेवा सिर्फ उन तरीकों को लपेटती है और शायद कुछ क्षेत्रों के मूल्यों को अपडेट करती है, लेकिन यह सटीक समान तरीकों का खुलासा करती है और सटीक उसी प्रकार को वापस लाती है। मैंने संदर्भ कई बार फिर से बनाने की कोशिश की है, और हर बार, यह हमेशा मेरे फ़ील्ड का नाम बदलता है: विविध "STUFF" wsdl और प्रॉक्सी में "sTUFFField" के रूप में उजागर होता है। परिवर्तनीय "एक्स" को "xField", आदि के रूप में उजागर किया गया है।

मजेदार बात यह है कि मैं पैटर्न को समझ नहीं पा रहा हूं - मैंने एक नई एएसएमएक्स वेब सेवा को परीक्षण और रैपिंग के रूप में बनाने की कोशिश की - चर का नाम बदल नहीं दिया गया है फिर। इसलिए मैं पैटर्न का पता नहीं लगा सकता कि क्यों/जब डब्ल्यूसीएफ वैरिएबल का नाम बदलता है।

कोई भी जानता है?

+0

क्या इससे कोई फर्क पड़ता है? यदि हां, तो _how_ क्या इससे कोई फर्क पड़ता है? –

+2

इससे कोई फर्क नहीं पड़ता। मेरे पास दो उपयोग के मामले हैं (आंतरिक बनाम बाहरी उपयोगकर्ताओं के लिए)। आंतरिक उपयोगकर्ता मेरी रैपर सेवा को बाईपास कर सकते हैं और अंतर्निहित विरासत सेवा (सीधे लॉगिन करने की आवश्यकता को छोड़कर) पर जा सकते हैं। बाहरी उपयोगकर्ताओं को रैपर सेवा के माध्यम से जाना है और इसे पासवर्ड देना है, लेकिन चूंकि आंतरिक और बाहरी सेवाएं अब फ़ील्ड को अलग-अलग नाम देती हैं, इसलिए मैं दोनों सेवाओं से बात करने के लिए एक ही कोड साझा नहीं कर सकता। मुझे प्रत्येक सेवा के लिए कोड के विभिन्न संस्करण लिखने की जरूरत है। – tavistmorph

उत्तर

3

आमतौर पर, जेनरेट प्रॉक्सी में "एक्सफिल्ड" और "वाईफिल्ड" आंतरिक/संरक्षित/निजी फ़ील्ड के रूप में होगा, और "एक्स" और "वाई" नामक गुणों के माध्यम से मूल्यों का पर्दाफाश करेगा। ऐसे विकल्प हैं जिन्हें आप प्रॉक्सी क्लाइंट बनाने के दौरान सेट कर सकते हैं ताकि आपकी पसंद के अनुसार ट्विक किया जा सके।

अद्यतन: मुझे इस व्यवहार को नियंत्रित करने के लिए कोई स्विच या विकल्प नहीं दिख रहे हैं। यह क्लाइंट प्रॉक्सी बनाने के लिए कौन सी धारावाहिक (डेटाकंट्रैक्टसाइराइज़र बनाम एक्सएमएलएसरियलाइज़र) डब्ल्यूसीएफ उपयोग करता है, इस पर निर्भर हो सकता है।

अंत में, यह वास्तव में कोडिंग शैली का एक मुद्दा है या नहीं - कार्यात्मक रूप से, इससे कोई फर्क नहीं पड़ता है।

मार्क

+0

ठीक है, इस तरह यह सामान्य काम करता है, लेकिन मुझे लगता है कि सार्वजनिक क्षेत्रों का नाम बदल दिया गया है। इसलिए आंतरिक क्षेत्रों को "XFieldField" कहा जाता है और सार्वजनिक एक्सेसर को "एक्सफिल्ड" कहा जाता है। मैं जो चाहता हूं वह नहीं, और इसका मतलब है कि रैपर सेवा का इंटरफ़ेस वास्तविक सेवा के इंटरफ़ेस से अलग हो जाता है। तो अब मैं दो सेवाओं को एक दूसरे के साथ व्यवहार नहीं कर सकता। – tavistmorph

+0

यह अजीब और अप्रत्याशित - आप अपने क्लाइंट प्रॉक्सी कैसे बनाते हैं? विजुअल स्टूडियो में या svcutil.exe का उपयोग कर ?? –

+0

बिल्कुल - अजीब और अप्रत्याशित। यह केवल एक परियोजना पर हो रहा है, इसलिए मैं पैटर्न को समझ नहीं सकता। लेकिन मैंने "सेवा संदर्भ जोड़ें" पर क्लिक करके, विजुअल स्टूडियो के साथ क्लाइंट प्रॉक्सी बनाया। मदद के लिए – tavistmorph

4

मैं एक ही समस्या थी, लेकिन मैं समाधान खोजने के लिए सक्षम था।

इंटरफ़ेस में यदि आप [DataContractFormat] टैग जोड़ते हैं तो आप "XFieldField" केस के साथ समाप्त हो जाएंगे। लेकिन यदि आप इसे इंटरफ़ेस में [XmlSerializerFormat] से प्रतिस्थापित करते हैं तो यह उत्पन्न प्रॉक्सी में नाम नहीं बदलेगा।

19

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

इंटरफ़ेस में [System.ServiceModel.XmlSerializerFormatAttribute()] जोड़ना, और क्लाइंट कोड को पुन: उत्पन्न करने से मेरे लिए समस्या हल हो गई।

public interface IMyService 
{ 
    [System.ServiceModel.XmlSerializerFormatAttribute()] 
    [System.ServiceModel.OperationContract] 
    recordResponse GetRecord(recordRequest request); 

} 
+0

धन्यवाद। यह मेरे लिए भी हल हो गया है, लेकिन क्या आपको पता है कि कोड क्या कर रहा है और यह समस्या को कैसे हल कर रहा है? – batmaci

+1

@batmaci जब आप विजुअल स्टूडियो में "सेवा संदर्भ जोड़ें", डब्ल्यूसीएफ सेवा कॉल करने के लिए क्लाइंट कोड उत्पन्न कर रहा है। यह डिफ़ॉल्ट रूप से DataContractSerializer का उपयोग करेगा। XmlSerializerFormatAttribute को जोड़ना डब्लूसीएफ को XmlSerializer का उपयोग करके कोड उत्पन्न करने का कारण बनता है। एक बार XmlSerializerFormatAttribute के साथ एक बार सेवा संदर्भ जोड़ने का प्रयास करें और बिना किसी के, और जेनरेट की गई कोड फ़ाइल (Reference.cs) में अंतरों की तुलना करें। – tgriffin

+0

मुझे विश्वास नहीं है कि यह जवाब यहां 2 साल तक बैठा है। मैं इस जवाब के लिए एसओ और वेब के माध्यम से पागलपन खोज रहा हूं। यह सचमुच मेरी प्रार्थना का उत्तर है। यदि भविष्य में उन लोगों के लिए इसका उपयोग किया जाता है जो इस समस्या का सामना करते हैं, [यहां] (http://stackoverflow.com/a/20713299/2453110) एक डॉक्यूसाइन ईवेंट श्रोता बनाने के बारे में मेरे समान प्रश्न का लिंक है उनकी कनेक्ट अधिसूचना सेवा के लिए। –

0

मैं भी इस समस्या थी, लेकिन ग्राहक से मैं अभी भी इंटरफेस पर उल्लेख किया परिवर्तन करने के बाद भी वर्ग के सदस्यों के अंत में Field हो रही थी।

समस्या यह थी कि, मैं डिस्क फ़ाइल क्रमबद्ध अनुरोधों के साथ काम करने के लिए DataContractSerializer का उपयोग कर रहा था (हमारी सेवा के परीक्षण के दौरान, हम प्रदाता से क्रमबद्ध अनुरोध प्राप्त कर रहे थे, लाइव होने से पहले डीबग करने में सक्षम होने के लिए)।

के बाद बदल रहा DataContractSerializer एक XmlSerializer को (अ typeof() कॉल द्वारा) मूल तत्व इसके निर्माता पर निर्दिष्ट करने और rootnamespace (क्योंकि डिफ़ॉल्ट रूप से, XmlSerializers मानक नाम स्थान लिखना), मैं अनुरोध deserialize सकता है और साथ पूरी तरह से काम डब्ल्यूसीएफ सेवा।

उम्मीद है कि यह किसी की मदद करेगा। मैं इस "मुद्दे" के साथ बहुत समय खो गया।