2010-01-26 12 views
10

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

लेकिन पहले, यहाँ सेवाएं हैं:,

[DataContract(Namespace = "http://www.me.com/shared/")] 
public class Request { 
    [DataMember] 
    public int Input { get; set; } 
} 
[DataContract(Namespace = "http://www.me.com/shared/")] 
public class Response { 
    [DataMember] 
    public int Result { get; set; } 
} 

सेवाओं कुछ तुच्छ तरह से लागू किया जाता है, संकलित प्रकाशित - चलो:

[ServiceContract(Namespace = "http://www.me.com/services/")] 
public interface IFooService { 
    [OperationContract] 
    Response RunFoo(Request request); 
} 
[ServiceContract(Namespace = "http://www.me.com/services/")] 
public interface IBarService { 
    [OperationContract] 
    Response RunBar(Request request); 
} 

रिस्पांस और अनुरोध एक अलग विधानसभा में परिभाषित कर रहे हैं अब ग्राहक पक्ष में स्विच करें।

svcutil कमांड लाइन पर दोनों सेवाओं सहित

- इस तरह:

svcutil /o:Client.cs http://hostname.com/FooService.svc http://hostname.com/BarService.svc 

, दोहराया डेटा प्रकार के बारे में कई त्रुटि संदेश में परिणाम होगा

Error: There was a validation error on a schema generated during export: Source: Line: 1 Column: 9087 Validation Error: The global element ' http://schemas.microsoft.com/2003/10/Serialization/:anyType ' has already been declared.

के साथ शुरू और

Error: There was a validation error on a schema generated during export: Source: Line: 1 Column: 12817 Validation Error: The complexType ' http://www.me.com/shared/:Response ' has already been declared.

के साथ समाप्त

प्रत्येक सेवा के लिए अलग-अलग क्लाइंट-साइड फ़ाइल जेनरेट करना इन त्रुटियों है:

svcutil /o:Foo.cs http://hostname.com/FooService.svc 
svcutil /o:Bar.cs http://hostname.com/BarService.svc 

लेकिन तब साझा प्रकार (जैसे अनुरोध और प्रतिक्रिया के रूप में) की परिभाषा Foo.cs में और उसके बाद Bar.cs में दोहराया जाएगा, संकलक त्रुटियों में स्पष्ट रूप से हो जाती है।

तो, ऐसी सेवाओं का उपभोग करने वाले क्लाइंट-साइड कोड उत्पन्न करने का पारंपरिक तरीका क्या है?

सीमाएं:

  • ग्राहक के लिए साझा प्रकार युक्त
  • "सेवा संदर्भ जोड़ें ..." आदेश का उपयोग नहीं कर सकते हैं (ताकि वे svcutil.exe के/आर विकल्प इस्तेमाल कर सकते हैं) एक विधानसभा नहीं भेज सकते विजुअल स्टूडियो में - एक svcutil कमांड लाइन (या एक अन्य कमांड लाइन उपकरण) की आवश्यकता है।

उत्तर

5

ठीक है, मूल रूप से आप कर सकते हैं

  • या तो एक अलग विधानसभा में अपने साझा प्रकार डाल कि ग्राहकों जब ग्राहक कोड (जो आप पहले से ही के रूप में असंभव को खारिज)

या तो पैदा करने का उपयोग कर सकते :

  • आपको अलग-अलग सेवाओं के लिए प्रत्येक प्रॉक्सी उत्पन्न करना होगा, और प्रत्येक सेवा को "अनुरोध" और "प्रतिक्रिया" कक्षाओं की अपनी "प्रति" प्राप्त होगी

या तो आप आम विधानसभा साझा कर सकते हैं - या आप नहीं कर सकते हैं - मैं कोई अन्य विकल्प नहीं दिख रहा है, वास्तव में।

+0

लेकिन यह एक या स्थिति नहीं है। कमांडलाइन पर svcutil करने के लिए कई अंतिमबिंदुओं निर्दिष्ट करके, आप आउटपुट फाइलों कि कई सेवाओं में DTOs पुन: उपयोग का एक सेट उत्पन्न कर सकते हैं। सेवा पक्ष से असेंबली का पुन: उपयोग करने की कोई आवश्यकता नहीं है, और प्रत्येक सेवा के लिए एक ही वस्तु की अपनी प्रतियों की आवश्यकता नहीं है। – Bevan

4

आप नियमों बाहर एक साझा डीटीओ विधानसभा है के बाद से (क्यों, btw?), इस मामले में सबसे आसान विकल्प लग रहा है (svcutil को यानी दो कॉल) अलग सी # नामस्थान में प्रकार उत्पन्न करने के लिए हो सकता है, और दोनों के बीच डेटा मैप करें। अनिवार्य रूप से: दो सेवाओं से संयोग से समान रूप से डीटीओ का इलाज करें।

आप (वास्तविक डेटा नामस्थान आदि समान हैं यह सोचते हैं) automapper जैसी चीजों का उपयोग कर सकते काम कम करने के लिए, या आप juts ग्रुप ए से क्रमानुसार सकता है और ग्रुप बी में deserialize।

+0

सर्वर और ग्राहक विभिन्न संगठनों में हैं। इसलिए, मुझे या तो प्रत्येक ग्राहक तक पहुंचना होगा और उन्हें डीएलएल देना होगा या इसे डाउनलोड करने योग्य या ओपन-सोर्स उत्पाद में बदलना होगा। किसी भी मामले में, इसमें अधिक लोगों को शामिल किया जाएगा और एक डेवलपर बस कमांड लाइन विकल्पों के सही संयोजन को चुनने से अधिक कठिन और महंगा निर्णय होगा। – azheglov

0

आप ग्राहक उपयोगिता एक बार आप एक XXXXService.cs और एक output.config फ़ाइल मिल जाएगा चलाते हैं।

आप XXXXService वर्ग दिखाई देती है तो आप एक फ़ाइल में सब कुछ है। आप इन्हें एक अलग IXXXService और XXXService फ़ाइल और डेटाकंट्रैक्ट फ़ाइल के रूप में विभाजित कर सकते हैं।

तो फिर तुम दूसरी सेवा के लिए उपयोगिता चलाने के लिए और IXXXService1.cs और 1XXXService.cs फ़ाइल और एक ही datacontracts जोड़ सकते हैं आप इन 2.

के लिए साझा करने के लिए उपयोग कर सकते हैं मुझे यकीन है कि नहीं कर रहा हूँ अगर यह जवाब कर सकते हैं अपने सवाल। मेरे पास an example था जो आपकी मदद कर सकता है। आप कुछ और उदाहरण here कुछ MVC और WCF सामान से संबंधित देख सकते हैं।

2

WSCF ब्लू आप एक समाधान के करीब मिल सकता है यदि आपके पास पहले नहीं पाया है।

http://wscfblue.codeplex.com/

यह प्रत्येक प्रकार के लिए अलग-अलग फ़ाइलों का उत्पादन कर सकते बाद कार्यों पर अधिलेखित।

0

डाउनलोड करें नीचे दिए गए लिंक से WSCFblue-v1-पूर्वाभ्यास ज़िप, आपको उसे प्राप्त करने में मदद कर सकते हैं।

http://wscfblue.codeplex.com/releases/view/48529

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