2013-08-16 3 views
7

मेरे पास एक डब्ल्यूसीएफ सेवा है, इसे UserService पर कॉल करें। UserService में क्लास लाइब्रेरी का संदर्भ है। आइए इसे DoWork.dll पर कॉल करें। DoWork.dll में एक अलग सेवा के लिए डब्ल्यूसीएफ सेवा संदर्भ है जिसे हम CompanyService पर कॉल करेंगे।डब्ल्यूसीएफ एंडपॉइंट कॉन्फ़िगरेशन त्रुटि: 'अनुबंध' विशेषता अमान्य है?

अब, जब मैंने पहली बार UserService पर कॉल करने का प्रयास किया तो मुझे एक एंडपॉइंट त्रुटि संदेश कॉन्फ़िगर नहीं किया जाएगा। वेब के चारों ओर पढ़ने के बाद मुझे पता चला है कि मुझे नोड के तहत UserService के web.config में CompanyService बाइंडिंग और क्लाइंट जानकारी जोड़ने की आवश्यकता है।

संदेश यह है:

<system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="BasicHttpBinding_IComapnyService" /> 
     </basicHttpBinding> 
    </bindings> 
    <client> 
     <endpoint name="BasicHttpBinding_ICompanyService" 
      address="http://it-dev.company.local:81/Project/Copmpany/CompanyService.svc" 
      binding="basicHttpBinding" 
      bindingConfiguration="BasicHttpBinding_IComapnyService" 
      contract="CompanyService.ICompanyService" /> 
    </client> 

समस्या मेरे पास है contract="CompanyService.ICompanyService" मुझे त्रुटि से पता चलता है:

The 'contract' attribute is invalid - The value 'CompanyService.ICompanyService' is invalid according to its datatype 'clientContractType' - The Enumeration constraint failed.

अब अगर मैं UserService WCF परियोजना के लिए सीधे CompanyService संदर्भ जोड़ने के लिए, त्रुटि दूर हो जाती है (जाहिर है)। हालांकि, मुझे यह नहीं करना चाहिए। मैंने ICompanyService अनुबंध में नामस्थान को पूरी तरह अर्हता प्राप्त करने का प्रयास किया है और यह भी काम नहीं करता है। मैंने .suo फ़ाइल को हटा दिया है और प्रोजेक्ट का पुनर्निर्माण किया है और यह या तो काम नहीं करता है (वेब ​​पर कहीं और सुझाया गया है)। इसके अलावा, अगर मैं contract= टाइप करता हूं, तो मुझे ड्रॉप डाउन सूची मिलती है लेकिन CompanyService.ICompanyService कहीं भी नहीं है (केवल तभी जब मैं सीधे UserService प्रोजेक्ट में सेवा का संदर्भ देता हूं)।

मैंने Tools > WCF Service Configuration Editor का उपयोग करके इसे कॉन्फ़िगर करने का प्रयास किया है और इससे मदद नहीं मिलती है।

मुझे ध्यान रखना चाहिए कि सबकुछ ठीक काम करता प्रतीत होता है, लेकिन मुझे यह तथ्य पसंद नहीं है कि इंटेलिजेंस मुझे नीली squiggly अंडरलाइन और त्रुटि संदेश दे रहा है। UserServiceDoWork.dll के संदर्भ में काम करने के लिए मुझे web.config में कुछ और चाहिए, मुझे DoWork.dll संदर्भित करता है, जो बदले में CompanyService का संदर्भ देता है जिसका अनुबंध मैं ठीक से नहीं देख सकता।

किसी भी सुझाव की बहुत सराहना की जाती है। अग्रिम में धन्यवाद।

+0

मैं हाल ही में इस पर आया और पाया कि वास्तव में पूर्ण नामस्थान सहित मेरे मुद्दों में योगदान दे रहा था। इस समस्या के साथ किसी और के लिए नोट करने के लिए उपयोगी। – Ian

उत्तर

2

आप सही हैं - आपको यह करने की ज़रूरत नहीं है।

"सेवा संदर्भ" (ComanyService) के साथ एक DLL (DoWork.dll) रखने का आर्किटेक्चर खराब है। जब तक डीएलएल ने आपके लिए कंपनी सेवा को कॉल करने के लिए क्लाइंट एंडपॉइंट (कोड में) को कड़ी-कोडित नहीं किया है, तो डीएलएल का उपयोग करने वाले किसी भी व्यक्ति को उस सेवा के लिए क्लाइंट एंडपॉइंट को कॉन्फ़िगर करने का प्रयास करना होगा, जिसे वे नहीं जानते हैं। आपका क्या चल रहा है।

जब आप अपने उपयोगकर्ता सेवा से सीधे सेवा संदर्भ जोड़ते हैं तो यह काम करता है कि जब आप ऐसा करते हैं, तो आपको कंपनी सेवा मेटाडेटा से ServiceContract की एक प्रति प्राप्त होती है। इसे साबित करने के लिए, जेनरेट की गई संदर्भ.cs फ़ाइल देखें, कंपनी सेवा के लिए खोजें और आपको पता चलेगा कि इसमें [ServiceContract] विशेषता है, जो इसे डब्ल्यूसीएफ सेवा के रूप में पहचानती है। इसके अलावा, आप विधियों के लिए [ऑपरेशन कंट्रैक्ट] विशेषताओं, साथ ही किसी भी [DataContracts] सेवा को भी देखेंगे जो मेरा एक्सचेंज भी है। दूसरे शब्दों में, इन सभी "प्रकारों" को आपके प्रोजेक्ट में आयात किया गया है और जब आप संकलित करते हैं, तो क्लाइंट एंडपॉइंट को तुरंत चालू करते समय डब्ल्यूसीएफ अब इन प्रकारों को ढूंढने में सक्षम है।

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

DoWork.dll से सेवा निर्भरता को स्थानांतरित करने का एक बेहतर तरीका है। आप तर्क को उपयोगकर्ता सेवा कार्यान्वयन में ले जाकर ऐसा कर सकते हैं।

या, यदि आपको DoWork.dll को स्वतंत्र रखने की आवश्यकता है, तो डब्ल्यूडब्ल्यूएफ सेवा पर डूवॉर्क्स को लपेटने पर विचार करें, जो कंपनी सेवा पर निर्भरता लेता है। फिर, UserService से, नई DoWork सेवा के लिए एक सेवा संदर्भ जोड़ें। यह एसओए के किरायेदारों को ध्यान में रखते हुए और आपकी सेवाओं को स्वतंत्र रूप से विकसित करने की अनुमति देगा।

+0

जानकारी के लिए धन्यवाद। शायद मेरी वास्तुकला खराब है। कंपनी सेवा केवल एक डब्ल्यूसीएफ सेवा है क्योंकि मुझे इसे इंस्टेंसकॉन्टेक्स्टमोड सिंगल के सेवा व्यवहार के साथ सिंगलटन की तरह काम करने की आवश्यकता है। अब मेरे सिस्टम में, कंपनी सेवा में एक सेवा विधि को DoWork.DLL के अलावा कहीं भी नहीं कहा जाना चाहिए। तो मेरा अनुवर्ती प्रश्न है क्या मुझे DoWork.DLL में एंडपॉइंट को हार्ड-कोड करना चाहिए या क्या मुझे कॉमपनी सेवा के साथ सभी को दूर करना चाहिए और किसी भी तरह से अपने तर्क को DoWork.dll (किसी भी तरह सिंगलटन व्यवहार को बनाए रखना) में ले जाना चाहिए? धन्यवाद। – BBauer42

+1

नहीं, एंडपॉइंट हार्डकोड न करें। मैंने जो अंतिम विकल्प प्रस्तुत किया है वह शायद आपके परिदृश्य के लिए सबसे अच्छा काम करने जा रहा है। यह सुनिश्चित करने के लिए तरीकों (सुरक्षा सेटिंग्स के माध्यम से) हैं कि सर्विस रैपिंग DoWork.DLL एकमात्र सेवा है जो कंपनी सेवा को कॉल कर सकती है। तो, ऐसा कुछ। उपयोगकर्ता सेवा <--> न्यूवापर सेवा (डोवर्क) <--> कंपनी सेवा –

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