2011-11-27 9 views
13

संकेत: इस प्रश्न में कई डुप्लिकेट हैं, लेकिन कोई भी समाधान मेरे लिए काम नहीं करता है।डब्ल्यूसीएफ सामान्य प्रकारों का पुन: उपयोग नहीं किया गया

मेरे पास एक वेब सेवा और ग्राहक है, दोनों साझा साझा असेंबली "डेटामोडेल" के संदर्भ में हैं। मैं "सेवा संदर्भ जोड़ें ..." संवाद का उपयोग करके सेवा प्रॉक्सी बना रहा हूं और "सभी संदर्भित असेंबली में पुन: उपयोग प्रकार" का चयन करता हूं, लेकिन फिर भी यह मेरा पुन: उपयोग करने के बजाय नए प्रकार बनाता है।

  • यह काम करता था, लेकिन अब अचानक यह प्रकार अब
  • पुन: उपयोग नहीं कर रहा है साझा विधानसभा संदर्भित से पहले सेवा संदर्भ जोड़ने काम नहीं करता है
  • पुन: आरंभ करना VS2010 मदद नहीं करता है (मैं सभी अद्यतन है)
  • मैं एक साधारण POCO वर्ग (सिर्फ एक सरल एक पूर्णांक संपत्ति युक्त वर्ग), यह भी कोई भाग्य के साथ की कोशिश की
  • हटाया जा रहा है और फिर से जोड़ने सेवा संदर्भ (या साझा विधानसभा संदर्भ)
  • मदद नहीं की
  • केवल "निर्दिष्ट संदर्भित विधानसभाओं में पुन: उपयोग प्रकार" में साझा विधानसभा का चयन - कोई भाग्य
  • svcutil.exe /reference ही परिणाम

मैं किसी भी तरह बुद्धि के अंत में कर रहा हूँ अर्जित करता है। क्या कोई अन्य समाधान है?

संपादित करें: मुझे यह जोड़ना चाहिए कि मैंने अपनी परियोजना को पहले की ओर से रीसेट कर दिया है, और जो भी मैं उपयोग करता हूं, वही समस्या है। और मैं जानता हूं कि यह पहले के काम के साथ काम करता था!

+1

मुझे भी इस समस्या का सामना करना पड़ा। मेरे समाधान में समस्या यह थी कि एक पुस्तकालय एक और .NET Framework संस्करण – KroaX

उत्तर

13

सेवा संदर्भ जोड़ने से पहले साझा विधानसभा संदर्भित

ऐसा करने के लिए या कम से कम संदर्भ जोड़ने के बाद सेवा संदर्भ अद्यतन की आवश्यकता होगी, काम नहीं करता।

हटाया जा रहा है और फिर से जोड़ने सेवा संदर्भ (या साझा विधानसभा संदर्भ)

मदद नहीं की और आप ऐसा करने की जरूरत नहीं होनी चाहिए, लेकिन मैं यह भी कोशिश की है जाएगा।

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

यहाँ अपने समाधान के लिए

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

यदि अन्य सभी विफल हो जाते हैं, तो दोनों पक्षों पर एक ही ऑब्जेक्ट को मजबूर करने का सबसे अच्छा तरीका 'सेवा संदर्भ' प्रॉक्सी को पूरी तरह से निकालना और चैनलफ़ैक्टरी विधि का उपयोग करना है। Simpler Explanation of How to Make Call WCF Service without Adding Service Ref और VS2010 Advantages of Add Service Reference over direct ClientBase<> देखें। यह मेरा पसंदीदा डब्ल्यूसीएफ पैटर्न है क्योंकि यह 'सेवा संदर्भ अपडेट करें ...' की आवश्यकता को हटा देता है, और जेनरेट किए गए प्रॉक्सी कोड को हटा देता है।

+0

अच्छा सुझाव! यह सब जांच लिया गया है, और साझा डीएलएल सेवा और ग्राहक दोनों में एक ही निर्माण है। तो, मेरा निष्कर्ष यह है कि यह सुविधा मेरे लिए पर्याप्त विश्वसनीय नहीं है और मैं प्रॉक्सी को 'IChannelFactory 'समाधान द्वारा प्रतिस्थापित और प्रतिस्थापित कर दूंगा। – AndiDog

+0

@AndiDog svcutil codegen टूल आमतौर पर वास्तव में अच्छा होता है लेकिन मुझे इसके साथ कुछ समस्याएं आई हैं; एक बार जब आप चैनलफैक्टरी पैटर्न का उपयोग करेंगे तो आप इसकी लालित्य देखेंगे और शायद कभी भी 'सेवा संदर्भ ...' –

+2

पर वापस नहीं जाएंगे, अब मैंने बहुत कम प्रयास के साथ 'चैनल फैक्टरी ' का उपयोग करने के लिए अपना कार्यान्वयन बदल दिया है। यदि अनुबंध (IMYService) एक साझा असेंबली में हो सकता है तो यह वास्तव में एक अच्छा समाधान है। धन्यवाद! – AndiDog

2

यह एक लंबा शॉट है, लेकिन एक संभावना यह है कि साझा डीएल का पुराना संस्करण जीएसी में है।

यह साझा डीएलएल का उपयोग करने का प्रयास करता है, गायब प्रकारों के साथ एक डीएल पाता है, और फिर प्रकार बनाने के लिए बदल जाता है।

+0

का उपयोग कर रहा था, मैं बिल्कुल जीएसी का उपयोग नहीं कर रहा हूं, इसके बजाय मेरे पास मेरी सभी परियोजनाओं का समाधान है, और मैं परियोजना संदर्भों का उपयोग कर रहा हूं। – AndiDog

2

ऑब्जेक्टेशन!

हमें हाल ही में वही समस्या थी जहां मैं काम करता हूं। हमें समस्या का शिकार करने में चार घंटे लग गए, लेकिन हमने अंततः खोज की कि एक ऑब्जेक्ट पर एक वस्तु जो एक प्रतिलिपि के रूप में प्रतिलिपि करने से इनकार कर रही थी, उसी नाम के रूप में एक ही नाम था जिसका उपयोग सेवा में किया जा रहा था, इसलिए यह उस डीएल से किसी भी प्रकार का पुन: उपयोग करने से इनकार कर दिया।

सुझाव (समाधान?): सुनिश्चित करें कि उन वस्तु पर DLLs में कोई अन्य वस्तुओं, या वस्तुओं देखते हैं कि सुनिश्चित , या ... आदि आपकी सेवा में से एक के रूप में एक ही नाम है।

10

मैं बस यह पता लगाने की कोशिश कर रहा हूं कि मेरे साझा डीएल के प्रकारों का पुन: उपयोग क्यों नहीं किया जा रहा था जब मैंने वीएस2013 में एक सेवा संदर्भ जोड़ा। यह पता चला है कि सेवा क्रमिकरण से संबंधित कई समस्याएं थीं। मेरे पास कुछ समेकन थे जिनके पास EnumMember विशेषता नहीं थी। जिस तरह से मैं अपने मुद्दों को हल कर निम्न चरणों को आज़माकर थे:

  1. बाहर टिप्पणी करते हुए सभी कार्यों मेरी ServiceContract में (OperationContract विशेषता के साथ सजाया विधि) कि परमाणु प्रकार वापस नहीं आए।
  2. फिर मेरे क्लाइंट प्रोजेक्ट में मेरा सेवा संदर्भ अपडेट करना। मुझे एहसास हुआ कि जब मेरी क्लाइंट प्रोजेक्ट में समस्या हल हो गई थी, तो मैं "[MyServiceReferenceName] टाइप कर सकता था।" और मेरे प्रकार [MyServiceReferenceName] नामस्थान में प्रकट नहीं हुए थे। मैंने यह सुनिश्चित करने के लिए एक्सएमएल स्कीमा ब्राउज़र में जेनरेट की गई एक्सएसडी फाइलों को खोलकर इसे सत्यापित किया।
  3. एक-एक करके, टिप्पणी हटाएं एक विधि कि चरण 1. फिर अद्यतन आपकी सेवा संदर्भ हर बार करता है, तो प्रकार के होते हैं या resued नहीं किया जा रहा है देखने के लिए टिप्पणी की गयी है।
  4. एक बार जब आप सेवा संदर्भ को पुन: उपयोग करने में असफल होने का तरीका ढूंढते हैं तो, प्रत्येक श्रेणी में उन प्रकार के लिए जाएं जो विधि या इनपुट के आउटपुट हैं। जांचें कि सभी कक्षा जो आप serialize करना चाहते हैं [DataContract] विशेषता से सजाए गए हैं। सुनिश्चित करें कि सभी फ़ील्ड्स और गुण [डेटामेम्बर] विशेषता से सजाए गए हैं। साथ ही, सुनिश्चित करें कि enums [DataContract] से सजाए गए हैं और प्रत्येक गणना मूल्य [EnumMember] से सजाया गया है।

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

+1

यहां मेरा अनुभव है: यह निश्चित रूप से प्रकार साझा कर रहा था। मेरे पास 3 प्रकार थे - 2 वर्ग और एक enum जहां एक वर्ग दूसरे वर्ग के उदाहरण और enum के लिए एक संपत्ति संदर्भ। मैंने जो सेवा कोड जोड़ा है, उस पर टिप्पणी की, फिर प्रत्येक को '[ऑपरेशन कंट्रैक्ट]' के साथ एक डमी विधि जोड़ा, सेवा प्राप्त की, सत्यापित किया कि एक प्रति नहीं थी, फिर उस कोड को हटा दिया गया और कोड को पहले से असम्बद्ध कर दिया गया। विचित्र रूप से पर्याप्त, यह तय है। मुझे नहीं पता कि क्यों और फंसे होने के लिए यह मुझे थोड़ा सा फिक्र करता है। –

+0

धन्यवाद - मुझे एक enum मिला है कि मैं डेटाकंट्रैक्ट बनाने और EnumMembers बनाने के लिए भूल गया था। – mdebeus

+0

अच्छी सलाह। यह डेटाकंट्रैक्ट को बदलता है या इसकी कमी भी मेरी समस्या थी। –

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

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