जवाबों:
आम तौर पर मुझे लगता है कि यह एक कोड-जीन मुद्दा है और अधिकांश समय ऐसा है क्योंकि मुझे एक प्रकार का नाम संघर्ष मिला है जो इसे हल नहीं कर सका।
यदि आप अपने सेवा संदर्भ पर राइट-क्लिक करते हैं और कॉन्फ़िगर और अनचेक करें "संदर्भ प्रकारों में पुन: उपयोग के प्रकार" को अनचेक करें तो यह समस्या को हल करेगा।
यदि आप इस सुविधा के कुछ पहलू का उपयोग कर रहे थे, तो आपको यह सुनिश्चित करने की आवश्यकता होगी कि आपके नाम साफ हो जाएं।
जैसा कि स्वीकृत उत्तर बताते हैं, एक प्रकार का संदर्भ मुद्दा जब प्रकार पुन: उपयोग करना संभवत: अपराधी है। मैंने पाया कि जब आप आसानी से समस्या का निर्धारण नहीं कर सकते हैं तो svcutil.exe कमांड लाइन का उपयोग करके आपको अंतर्निहित समस्या को प्रकट करने में मदद मिलेगी (जैसा कि जॉन सॉन्डर्स बताते हैं)।
एक वृद्धि के रूप में यहाँ svcutil का उपयोग करने का एक त्वरित उदाहरण है।
svcutil /t:code https://secure.myserver.com/services/MyService.svc /d:test /r:"C:\MyCode\MyAssembly\bin\debug\MyAssembly.dll"
कहाँ पे:
पूर्ण svcutil कमांड लाइन संदर्भ यहाँ: http://msdn.microsoft.com/en-us/library/aa347733.aspx
एक बार जब आप svcutil चलाते हैं, तो आपको आयात द्वारा फेंके जाने वाले अपवाद को देखना चाहिए। आपको इस प्रकार का संदेश आपके किसी एक प्रकार के बारे में प्राप्त हो सकता है: "संदर्भित प्रकार का उपयोग नहीं किया जा सकता है क्योंकि यह आयातित DataContract से मेल नहीं खाता है"।
यह बस के रूप में निर्दिष्ट किया जा सकता है कि सेवा के लिए DataContract में जो उत्पन्न हुआ था, उसमें से संदर्भित विधानसभा में एक प्रकार में अंतर है। मेरे मामले में, मैं जिस सेवा का आयात कर रहा था, उसके पास साझा असेंबली में मेरे पास नए, अद्यतन प्रकार थे। यह स्पष्ट रूप से स्पष्ट नहीं था क्योंकि अपवाद में उल्लिखित प्रकार समान था। जो अलग था वह नेस्टेड जटिल प्रकारों में से एक था।
ऐसे और भी जटिल परिदृश्य हैं जो इस प्रकार के अपवाद को ट्रिगर कर सकते हैं और परिणामस्वरूप रिक्त संदर्भ ।cs। यहाँ एक उदाहरण है ।
यदि आप इस समस्या का सामना कर रहे हैं और आप अपने डेटा अनुबंधों में जेनेरिक प्रकारों का उपयोग नहीं कर रहे हैं और न ही आप IsReference = true का उपयोग कर रहे हैं, तो मैं यह निश्चित करने की अनुशंसा करता हूं कि आपके साझा प्रकार आपके क्लाइंट और सर्वर पर बिल्कुल समान हैं। अन्यथा, आप संभवतः इस समस्या में भाग लेंगे।
जब ऐसा होता है, तो एरर्स विंडो और आउटपुट विंडो में देखें कि क्या कोई त्रुटि संदेश है या नहीं। यदि वह मदद नहीं करता है, svcutil.exe
तो मैन्युअल रूप से चलाने का प्रयास करें , और देखें कि क्या कोई त्रुटि संदेश हैं।
मैं इस सटीक समस्या के साथ पूरे दिन के लिए अपना सिर काट रहा हूं। मैंने अभी इसे ठीक किया है। ऐसे...
एसएसएल पर सेवा को चलाना था (यानी यह https://mydomain.com/MyService.svc पर है )
एक विकास सर्वर पर WCF सेवा के लिए एक सेवा संदर्भ जोड़ना ठीक काम किया।
लाइव प्रोडक्शन सर्वर पर डब्ल्यूसीएफ सेवा के ठीक उसी बिल्ड को तैनात करना , फिर क्लाइंट एप्लिकेशन पर स्विच करना और लाइव सर्विस को इंगित करने के लिए सर्विस रेफरेंस को कॉन्फ़िगर करना कोई त्रुटि नहीं दिखाई देता, लेकिन ऐप नहीं बनेगा: यह पता चलता है कि सर्विस रेफरेंस Reference.cs फ़ाइल पूरी तरह से खाली थी! सेवा संदर्भ को अपडेट करने से कोई फर्क नहीं पड़ा। समाधान की सफाई से कोई मदद नहीं मिली। VS2010 को फिर से शुरू करने से कोई फर्क नहीं पड़ा। एक नया रिक्त समाधान बनाना, एक सांत्वना परियोजना शुरू करना और लाइव सेवा के लिए एक सेवा संदर्भ जोड़ना बिल्कुल उसी समस्या को प्रदर्शित करता है।
मुझे नहीं लगा कि यह परस्पर विरोधी प्रकारों या किसी भी चीज के कारण था, लेकिन क्या हीक - मैंने "सभी संदर्भित विधानसभाओं में पुन: उपयोग के प्रकार" को अनचेक करके WCF सेवा संदर्भ को फिर से जोड़ दिया। कोई आनंद नहीं है; मैंने चेक मार्क वापस लगा दिया।
अगला कदम संदर्भ URL पर svcutil को देखने की कोशिश करना था कि क्या समस्या को उजागर करने में मदद मिलेगी। यहाँ आदेश है:
svcutil /t:code https://mydomain.com/MyService.svc /d:D:\test
इससे निम्नलिखित उत्पादन हुआ:
Microsoft (R) Service Model Metadata Tool
[Microsoft (R) Windows (R) Communication Foundation, Version 4.0.30319.1]
Copyright (c) Microsoft Corporation. All rights reserved.
Attempting to download metadata from 'https://mydomain.com/MyService.svc' using WS-Metadata Exchange or DISCO.
Error: Cannot import wsdl:portType
Detail: An exception was thrown while running a WSDL import extension: System.ServiceModel.Description.DataContractSerializerMessageContractImporter
Error: Schema with target namespace 'http://mynamespace.com//' could not be found.
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://mynamespace.com//']/wsdl:portType[@name='IMyService']
Error: Cannot import wsdl:binding
Detail: There was an error importing a wsdl:portType that the wsdl:binding is dependent on.
XPath to wsdl:portType: //wsdl:definitions[@targetNamespace='http://mynamespace.com//']/wsdl:portType[@name='IMyService']
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:binding[@name='WSHttpBinding_IMyService']
Error: Cannot import wsdl:port
Detail: There was an error importing a wsdl:binding that the wsdl:port is dependent on.
XPath to wsdl:binding: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:binding[@name='WSHttpBinding_IMyService']
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:service[@name='MyService']/wsdl:port[@name='WSHttpBinding_IMyService']
Generating files...
Warning: No code was generated.
If you were trying to generate a client, this could be because the metadata documents did not contain any valid contracts or services
or because all contracts/services were discovered to exist in /reference assemblies. Verify that you passed all the metadata documents to the tool.
Warning: If you would like to generate data contracts from schemas make sure to use the /dataContractOnly option.
इससे मैं पूरी तरह से लड़खड़ा गया था। भारी googling और वास्तव में बल्कि पार पाने के बावजूद, और एक बस चालक के रूप में एक कैरियर पर पुनर्विचार करते हुए, मैंने आखिरकार विचार किया कि इसने विकास के बॉक्स पर क्यों काम किया। यह एक IIS कॉन्फ़िगरेशन समस्या हो सकती है?
मैंने विकास और लाइव बॉक्स दोनों में एक साथ रीमोट किया, और प्रत्येक पर मैंने IIS प्रबंधक (IIS 7.5 चला रहा है) को निकाल दिया। अगला, मैं प्रत्येक सर्वर पर मूल्यों की तुलना करते हुए, प्रत्येक बॉक्स पर प्रत्येक कॉन्फ़िगरेशन सेटिंग के माध्यम से गया।
और समस्या है: साइट के लिए "एसएसएल सेटिंग्स" के तहत, सुनिश्चित करें कि "एसएसएल की आवश्यकता है" चेक किया गया है, और "स्वीकार" के लिए क्लाइंट सर्टिफिकेट रेडियो बटन की जांच करें। निर्धारित समस्या!
मैंने पाया है कि जब भी मैं कोई संदर्भ जोड़ता हूं, तो उसे हटाता हूं, और फिर उसी नाम से एक सेवा को फिर से जोड़ता हूं। प्रकार की उलझनें पुरानी फाइलों के कारण दिखाई देती हैं, जो विज़ुअल स्टूडियो अभी भी देख सकते हैं। इसे ठीक करने के लिए मुझे बस इतना ही करना चाहिए, नए संदर्भ को जोड़ने से पहले एक साफ है।
उम्मीद है की यह मदद करेगा।
पिछले संस्करण से अपग्रेड किए गए सिल्वरलाइट 5 के साथ मुझे यह समस्या थी।
यहां तक कि सेवा संदर्भ को फिर से जोड़ने पर भी मुझे एक खाली संदर्भ दिया गया
मैंने एक नया प्रोजेक्ट बनाने और सेवा संदर्भ को फिर से बनाने के लिए समाप्त कर दिया। यदि आपने इस पर लगभग आधे घंटे से अधिक समय बिताया है, तो यह प्रयास करना है। यहां तक कि अगर आप मूल परियोजना को ठीक करने के लिए दृढ़ हैं, तो आप यह देखना चाहते हैं कि क्या होता है और फिर समस्या को ठीक करने की कोशिश करने के लिए पीछे की ओर काम करें।
मैंने कभी पता नहीं लगाया कि समस्या क्या थी - लेकिन संभवतः .csproj फ़ाइल में कुछ अपग्रेड नहीं किया गया था या कुछ सेटिंग गलत हो गई थी।
System.Xml.Linq
- इसलिए यदि आपने स्विच किए हुए संस्करण
यदि आपने हाल ही में अपनी परियोजना में एक संग्रह जोड़ा है जब यह होने लगा, तो समस्या दो संग्रह की वजह से हो सकती है जिसमें समान CollectionDataContract विशेषता है:
[CollectionDataContract(Name="AItems", ItemName="A")]
public class CollectionA : List<A> { }
[CollectionDataContract(Name="AItems", ItemName="A")] // Wrong
public class CollectionB : List<B> { }
मैंने अपनी परियोजना के माध्यम से स्वीप करके त्रुटि को ठीक किया और यह सुनिश्चित किया कि प्रत्येक नाम और आइटम नाम अद्वितीय था:
[CollectionDataContract(Name="AItems", ItemName="A")]
public class CollectionA : List<A> { }
[CollectionDataContract(Name="BItems", ItemName="B")] // Corrected
public class CollectionB : List<B> { }
फिर मैंने सेवा संदर्भ को फिर से ताज़ा किया और सब कुछ फिर से काम किया।
मेरा मुद्दा यह था कि मैंने अपनी वेब सेवा लिंक के अंत में " मेक्सिको " छोड़ दिया था ।
इसके बजाय " http://yeagertech.com/yeagerte/YeagerTechWcfService.YeagerTechWcfService.svc/mex "
" Http://yeagertech.com/yeagerte/YeagerTechWcfService.YeagerTechWcfService.svc " का उपयोग करें
इस तकनीक ने मेरे मामले में मेरे लिए काम किया, इन उत्तरों को बिना किसी लाभ के पढ़ने के बाद, बस मेरे सभी अनुबंधों पर टिप्पणी करना था, और जब तक यह काम नहीं करता है, तब तक बिट्स को द्विआधारी खोज फैशन में। यह कोड के अपमानजनक बिट को कम करता है।
तब आपको केवल यह अनुमान लगाना होगा कि उस कोड में क्या गलत है।
उपकरण में कुछ त्रुटि प्रतिक्रिया, निश्चित रूप से मदद की होगी।
मैं एक वेब सेवा अनुबंध लिख रहा हूं। मेरे पास एक प्लेसहोल्डर एनम था जिसमें कोई सदस्य नहीं था। ठीक है। लेकिन अगर मैं इसे किसी अन्य वर्ग की संपत्ति में उपयोग करता हूं, और क्लाइंट पर अनुबंध dll का फिर से उपयोग करता हूं, तो कोडगैन एक त्रुटि संदेश के साथ फट जाता है। Svcutil.exe को चलाने में मदद नहीं मिली, यह सिर्फ उल्लेख किए बिना एक सीएस फ़ाइल को आउटपुट करने में विफल रहा।
निम्नलिखित को यहां सूचीबद्ध नहीं किया गया है, और यह वह समाधान था जिसे मैंने अपनाया था (SvcUtils त्रुटि संदेश देखने में उपयोगी था। हालाँकि, मुझे जो त्रुटि मिली थी wrapper type message cannot be projected as a data contract type since it has multiple namespaces
। मतलब, मैंने इस लीड का पालन किया, और इस पोस्ट के wsdl.exe
माध्यम से सीखा )।
मेरे मामले में, बस wsdl [ my-asmx-service-address ] को चलाने से एक समस्या-मुक्त .cs
फ़ाइल उत्पन्न हुई , जिसे मैंने अपनी परियोजना में शामिल किया और सेवा का उपयोग करने के लिए प्रेरित किया।
जैसा कि @dblood बताते हैं, मुख्य दर्द DataContractSerializer में है, जो सही प्रकार से पुन: उपयोग नहीं करता है। यहाँ पहले से ही कुछ उत्तर हैं इसलिए मैं कुछ प्रो और इन के बारे में विपक्ष जोड़कर शुरू करूँगा:
सौभाग्य से, यदि आप अपनी सेवा के नियंत्रण में हैं, तो एक सरल समाधान है जो इन सभी मुद्दों को हल करता है। इसका मतलब यह है कि आप अभी भी DLL के पार सेवा इंटरफेस का उपयोग कर सकते हैं - जो एक उचित समाधान के लिए IMO होना चाहिए। यह इस तरह से काम करता है:
अपनी पसंदीदा विधि का उपयोग करके क्लाइंट का निर्माण करने के लिए उसी DLL का उपयोग करें। उदाहरण के लिए (IMyInterface सेवा अनुबंध इंटरफ़ेस है):
var httpBinding = new BasicHttpBinding();
var identity = new DnsEndpointIdentity("");
var address = new EndpointAddress(url, identity, new AddressHeaderCollection());
var channel = new ChannelFactory<IMyInterface>(httpBinding, address);
return channel.CreateChannel();
दूसरे शब्दों में: 'ऐड सर्विस रेफ़रेंस' की कार्यक्षमता का उपयोग न करें , लेकिन WCF को प्रॉक्सी पीढ़ी को दरकिनार करके (सही) सेवा प्रकारों का उपयोग करने के लिए मजबूर करें। आखिरकार, आपके पास पहले से ही ये कक्षाएं हैं।
प्रो की:
विपक्ष:
जब दोनों पक्षों पर परियोजना संदर्भों (सेवा परियोजना और सेवा का संदर्भ होने वाली परियोजना) के साथ काम करते समय मेरे पास टूटी हुई सेवा संदर्भों का मुद्दा था। यदि उदाहरण के लिए संदर्भित प्रोजेक्ट की .dll को "Contoso.Development.Common" कहा जाता है, लेकिन प्रोजेक्ट्स का नाम केवल "कॉमन" के लिए छोटा है, तो इस प्रोजेक्ट के प्रोजेक्ट रेफरेंस को "कॉमन" नाम दिया गया है। हालांकि सेवा को वर्गों के समाधान के लिए "Contoso.Development.Common" के संदर्भ का अनुमान है (यदि यह विकल्प सेवा संदर्भ विकल्पों में सक्रिय है)।
इसलिए एक्सप्लोरर के साथ मैंने प्रोजेक्ट का फ़ोल्डर खोला जो सेवा और "कॉमन" -प्रोजेक्ट को संदर्भित कर रहा है। वहां मैंने नोटपैड के साथ वीएस प्रोजेक्ट फाइल (.csproj) को एडिट किया। संदर्भित प्रोजेक्ट के नाम की खोज करें (जो इस उदाहरण में "Common.csproj" है) और आपको प्रोजेक्ट संदर्भ का प्रतिनिधित्व करने वाली कॉन्फ़िगरेशन प्रविष्टि जल्दी मिल जाएगी।
मैं बदल गया
<ProjectReference Include="..\Common\Common.csproj">
<Project>{C90AAD45-6857-4F83-BD1D-4772ED50D44C}</Project>
<Name>Common</Name>
</ProjectReference>
सेवा
<ProjectReference Include="..\Common\Common.csproj">
<Project>{C90AAD45-6857-4F83-BD1D-4772ED50D44C}</Project>
<Name>Contoso.Development.Common</Name>
</ProjectReference>
महत्वपूर्ण बात यह है कि संदर्भ के नाम को बदलने के लिए dll संदर्भित परियोजना आउटपुट के रूप में है।
फिर वीएस पर वापस स्विच करें। वहां आपको परियोजना को फिर से लोड करने के लिए कहा जाएगा क्योंकि इसे वी.एस. के बाहर संशोधित किया गया है। पुनः लोड बटन पर क्लिक करें।
ऐसा करने के बाद सेवा अद्यतन को जोड़ने के रूप में अपेक्षित के रूप में काम किया संदर्भ।
आशा है कि यह भी किसी और की मदद करता है।
सादर एम.एच.
मुझे विकास के दौरान कल इसी तरह के मुद्दे का सामना करना पड़ा। मुझे पता चला कि मैं अनुबंधों के 2 अलग-अलग संस्करणों में एक ही नाम स्थान का उपयोग कर रहा था।
हमने उदाहरण के लिए अनुबंध के 2 संस्करण version4 और version5 हैं। मैंने संस्करण 4 से सभी अनुबंधों की प्रतिलिपि बनाई है और संस्करण 4 से संस्करण 5 तक सभी नामों का नाम बदल दिया है। ऐसा करते समय मैं फ़ाइलों में से एक में v4 से v5 तक नाम स्थान का नाम बदलना भूल गया। नेमस्पेस संघर्ष के कारण, Reference.cs फ़ाइल खाली थी।
इस समस्या का निवारण करना कठिन है क्योंकि आपको सेवा संदर्भ जनरेट करते समय कोई त्रुटि संदेश नहीं मिलता है। इस समस्या की पहचान करने के लिए, मैंने अपने द्वारा बनाई गई सभी नई फ़ाइलों को मैन्युअल रूप से मान्य किया होगा। इस समस्या को हल करने के अन्य तरीके हैं। यह पहला कदम है जो आपको अन्य विकल्पों के लिए जाने से पहले प्रदर्शन करना चाहिए।
जॉन सॉन्डर्स पोस्ट के लिए धन्यवाद जिसने मुझे त्रुटि विंडो में देखने का विचार दिया। मैं पूरे दिन अपना सिर पीट रहा था और मैं किसी भी त्रुटि के लिए आउटपुट विंडो को देख रहा था।
मेरे मामले में अपराधी ISerializable था। मेरे पास DataMember प्रकार के अपवाद के साथ DataContract क्लास है। आपके पास किसी भी प्रकार का कोई DataMember नहीं हो सकता है जिसमें ISerializable कीवर्ड है। इस अपवाद में ISerializable है जैसे ही मैंने इसे हटा दिया सब कुछ एक आकर्षण की तरह काम किया।
इस समस्या का निवारण करने का प्रयास करते समय svcutil
, मुझे dblood के उत्तर में संदर्भित त्रुटि प्राप्त हुई ("संदर्भित प्रकार का उपयोग नहीं किया जा सकता क्योंकि यह आयातित DataContract से मेल नहीं खाता")।
मेरे मामले में अंतर्निहित कारण एक Enum प्रकार प्रतीत होता था जिसमें DataContract विशेषता थी, लेकिन जिनके सदस्यों को EnumMember विशेषता के साथ चिह्नित नहीं किया गया था। जिस समस्या वर्ग की svcutil
ओर इशारा किया गया था, उसके पास उस एनम प्रकार के साथ एक संपत्ति थी।
यह dblood के जवाब के लिए एक टिप्पणी के रूप में बेहतर होगा, लेकिन इसके लिए पर्याप्त प्रतिनिधि नहीं ...
मेरे मामले में मेरे पास VB वेब फॉर्म प्रोजेक्ट के साथ एक समाधान था जिसने C # UserControl का संदर्भ दिया था। वीबी परियोजना और सीएस परियोजना दोनों में एक ही सेवा का सेवा संदर्भ था। संदर्भ वीबी परियोजना में सेवा संदर्भ के तहत और सीएस (फ्रेमवर्क) परियोजना में कनेक्टेड सर्विसेज ग्रुपिंग के तहत दिखाई दिया।
सेवा संदर्भ को अद्यतन करने के लिए (जैसे, संदर्भ प्राप्त करें। Vb वेब फ़ॉर्म प्रोजेक्ट में संदर्भ। vb फ़ाइल खाली न हो), मुझे CS PROJECT को फिर से तैयार करने की आवश्यकता है, फिर VB सेवा संदर्भ को अद्यतन करें, फिर CS परियोजना को वापस जोड़ें समाधान।
इन कदमों का अनुसरण करें:
ऐसा लगता है कि सेवा को जोड़ने पर इन फ़ोल्डरों में कुछ संदर्भ छोड़ दिए जाते हैं, जिससे ऑटो-पीढ़ी के कोड के दौरान त्रुटियां होती हैं।