2012-03-01 9 views
17

मैं एक द्वि-दिशात्मक Stream जुड़ा के दोनों सिरों, जो मैं कुछ संचार से अधिक करना चाहता हूँ है रैप करने के लिए। धारा पीछे अंतर्निहित कार्यान्वयन महत्वपूर्ण है, मैं Stream स्तर पर काम करना चाहते हैं नहीं है ...WCF का उपयोग करते हुए एक मौजूदा जुड़े धारा

स्ट्रीम के लिए अपने ही संचार प्रोटोकॉल लागू, मैं रैप करने के लिए मौजूदा WCF अच्छाई के सभी उपयोग करना चाहते हैं के बजाय एक द्वि-दिशात्मक (अनुरोध/प्रतिक्रिया + कॉलबैक) डब्ल्यूसीएफ संचार चैनल के साथ मौजूदा धारा।

मेरे सवाल है, मैं यह कर के बारे में कैसे जा सकते हैं ...?

अद्यतन:

मैं एक कस्टम परिवहन को लागू करने के रास्ते नीचे चले गए हैं। मैं इस काम के लिए मिला है, लेकिन मैं अभी भी इसके साथ पूरी तरह से खुश नहीं हूँ ...

मैं एक IDuplexSessionChannel को क्रियान्वित किया है धारा रैप करने के लिए, उचित IChannelFactory और IChannelListener के साथ, और एक चैनल बनाने के लिए तत्व बाइंडिंग कारखाना। अब, मैं सिर्फ कनेक्टेड स्ट्रीम से गुजरता हूं, और आखिरकार इसे बनाए जाने पर परिवहन चैनल में भेजता हूं।

तो, मैं इस प्रकार धारा के माध्यम से सेवा तक पहुँचने के लिए ग्राहक प्रॉक्सी बना सकते हैं:

var callback = new MyCallback(); 
var instanceContext = new InstanceContext(callback); 
var pipeFactory = new DuplexChannelFactory<IMyService>(instanceContext, new StreamBinding(clientStream), 
                 new EndpointAddress("stream://localhost/MyService")); 
var serviceProxy = pipeFactory.CreateChannel(); 
समस्या मैं है है

, ऐसा लगता है WCF एक ServiceHost का उपयोग करने का सर्वर अंत बनाने के लिए पर सेट किया गया है चैनल, एक IChannelListener के माध्यम से। मेरे मामले में, मैं पहले से ही एक जुड़ा धारा है, और मुझे किसी भी अधिक इनकमिंग कनेक्शन के लिए सुनने के लिए सक्षम नहीं होगा। मैं इस पर काम कर सकते हैं, लेकिन मैं बहुत बल्कि एक ServiceHost का उपयोग नहीं चाहते हैं, क्योंकि मैं अस्पष्ट बॉयलरप्लेट का एक बहुत साथ खत्म, चैनल के सर्वर अंत बनाने के लिए और यह काम करने के लिए हैक करता।

प्रश्न

मैं देख रहा हूँ, इसलिए, एक बेहतर तरीका IDuplexSessionChannels लेते हैं, और दोनों सर्वर और ग्राहक समाप्त होता है पर एक चैनल प्रॉक्सी में इन रैप करने के लिए के लिए।

या हो सकता है एक अलग ServiceHost कार्यान्वयन है कि एक IChannelListener आवश्यकता नहीं है।

वास्तव में, समस्या यहाँ मैं एक ही सर्वर, कई ग्राहक व्यवस्था नहीं करना चाहती है, मैं अपने WCF सेवा और ग्राहक के बीच 1-1 से रिश्ता है। इनमें से किसी एक को तुरंत चालू करने का कोई सही तरीका है?

यह अभी तक दूसरे शब्दों में, मैं एक ServiceHost का उपयोग किए बिना सर्वर साइड सेवा उदाहरण बनाना चाहते हैं।

कोई सुझाव इस स्तर पर सराहना की जाएगी।

+0

लगता है आप एक WCF सेवा मेजबान और एक WCF सेवा उदाहरण की भूमिका भ्रमित किया जा सकता है की तरह। एक डब्ल्यूसीएफ सेवा होस्ट InstanceContextMode के आधार पर एक सेवा के उदाहरण प्रदान करता है। यह [ब्लॉग पोस्ट] (http://www.danrigsby.com/blog/index.php/2008/05/23/understanding-instancecontext-in-wcf/) है कि कैसे काम करता है की एक अच्छी व्याख्या है।सर्विसहोस्ट प्रदान किए बिना आपको वास्तव में डब्ल्यूसीएफ सेवा का उदाहरण नहीं मिल सकता है। बदले में सर्विसहोस्ट के लिए मैसेजिंग इंफ्रास्ट्रक्चर को प्रबंधित करने के लिए चैनल लिस्टनर पर निर्भरता है। इसके बिना, आपके पास "बहरा" ServiceHost होगा :) –

+0

तो, मैं जो करने की कोशिश कर रहा हूं वह है 'सर्विसहोस्ट'' इंस्टेंस कॉन्टेक्स्ट 'और सेवा उदाहरण बनाने के लिए करता है। 'ServiceHost' को यह तब करना चाहिए जब यह एक नया आने वाला कनेक्शन स्वीकार करता हो। मेरे पास पहले से कनेक्शन स्थापित है, इसलिए मैं सुनना हिस्सा छोड़ना चाहता हूं। निश्चित रूप से यह * असंभव * नहीं है ...? – Mark

+0

@ मार्क मेरे लिए यह एक मौजूदा सुरंग लेने और इसे रखने के लिए एक और सुरंग बनाने जैसा लगता है ... इस तरह के सामान के लिए डब्ल्यूसीएफ नहीं बनाया गया था ... मौजूदा धारा (जो आप लिख रहे हैं) के साथ समस्या वास्तव में क्या है क्या आपको लगता है कि डब्ल्यूसीएफ का उपयोग करने से आपको हल होगा? – Yahia

उत्तर

0

उपयोग दोनों सिरों पर एक ग्राहक। हालांकि आपको अपने अनुबंधों को ध्यान से परिभाषित करने की आवश्यकता होगी। यदि आपके पास क्लाइंट ए और क्लाइंट बी स्ट्रीम के किसी भी छोर पर है, जब क्लाइंटए अनुरोध भेजता है, तो क्लाइंटब यह अपेक्षा करता है कि यह कैसाबैक अनुबंध और इसके विपरीत परिभाषित किए गए जैसा दिखता है।

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