wcf - डब्ल्यूसीएफ चैनल फैक्ट्री बनाम प्रॉक्सी उत्पन्न कर रहा है




proxy channelfactory (4)

डब्ल्यूसीएफ क्लाइंट बनाने के 3 बुनियादी तरीके हैं:

  1. विजुअल स्टूडियो को अपनी प्रॉक्सी उत्पन्न करने दें। यह ऑटो कोड उत्पन्न करता है जो डब्ल्यूएसडीएल पढ़कर सेवा से जुड़ता है। अगर सेवा किसी भी कारण से बदलती है तो आपको इसे पुन: उत्पन्न करना होगा। इसका बड़ा फायदा यह है कि इसे स्थापित करना आसान है - वीएस में एक जादूगर है और यह सब स्वचालित है। नुकसान यह है कि आप अपने लिए कड़ी मेहनत करने के लिए वीएस पर भरोसा कर रहे हैं, और इसलिए आप नियंत्रण खो देते हैं।

  2. एक ज्ञात इंटरफ़ेस के साथ ChannelFactory उपयोग करें। यह आपके पास स्थानीय इंटरफेस रखने पर निर्भर करता है जो सेवा (सेवा अनुबंध) का वर्णन करता है। बड़ा फायदा यह है कि परिवर्तन को और अधिक आसानी से प्रबंधित कर सकते हैं - आपको अभी भी बदलावों को फिर से संकलित करना और ठीक करना होगा, लेकिन अब आप कोड पुन: उत्पन्न नहीं कर रहे हैं, आप नए इंटरफेस का संदर्भ दे रहे हैं। आम तौर पर इसका उपयोग तब किया जाता है जब आप सर्वर और क्लाइंट दोनों को नियंत्रित करते हैं क्योंकि दोनों इकाई परीक्षण के लिए अधिक आसानी से मजाक कर सकते हैं। हालांकि इंटरफेस किसी भी सेवा के लिए लिखा जा सकता है, यहां तक ​​कि आरईएसटी - इस ट्विटर एपीआई पर एक नज़र डालें।

  3. अपनी खुद की प्रॉक्सी लिखें - यह HttpClient या वेब HttpClient का उपयोग करके, विशेष रूप से आरईएसटी सेवाओं के लिए करना काफी आसान है। यह आपको सबसे अच्छा अनाज नियंत्रण देता है, लेकिन कई एपीआई एपीआई स्ट्रिंग में होने की लागत पर। उदाहरण के लिए: var content = new HttpClient().Get("http://yoursite.com/resource/id").Content; - यदि एपीआई परिवर्तन का विवरण आपको रनटाइम तक कोई त्रुटि नहीं मिलेगी।

व्यक्तिगत रूप से मुझे विकल्प 1 पसंद नहीं आया है - ऑटो जेनरेट कोड पर निर्भर गन्दा है और बहुत अधिक नियंत्रण खो देता है। इसके अलावा यह अक्सर क्रमबद्धता के मुद्दों को बनाता है - मैं दो समान वर्गों (सर्वर कोड में से एक, एक ऑटो जेनरेटेड) के साथ समाप्त होता हूं जिसे टाइड किया जा सकता है लेकिन दर्द होता है।

विकल्प 2 सही होना चाहिए, लेकिन चैनल थोड़ा सीमित हैं - उदाहरण के लिए वे पूरी तरह से HTTP त्रुटियों की सामग्री खो देते हैं । उस ने कहा कि सेवा का वर्णन करने वाले इंटरफेस रखने और बनाए रखने के लिए कोड करना बहुत आसान है।

बस आश्चर्यजनक है कि आप डब्ल्यूसीएफ सेवा से प्रॉक्सी उत्पन्न करना पसंद करेंगे जब आप चैनलफैक्टरी का उपयोग करके कॉल का आह्वान कर सकते हैं?

इस तरह आपको प्रॉक्सी उत्पन्न नहीं करना पड़ेगा और सर्वर अपडेट होने पर प्रॉक्सी को पुन: उत्पन्न करने की चिंता होगी?

धन्यवाद


प्रॉक्सी एसिंक फ़ंक्शन का निर्माण करेगा जिसके लिए अच्छा है।


मैं मेटाडाटा रीसोल्वर के साथ चैनलफैक्टरी का उपयोग करता हूं। विधि विधि। क्लाइंट कॉन्फ़िगरेशन परेशान है, इसलिए मुझे सर्वर से मेरा ServiceEndpoint मिलता है।

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

मेरे लिए चैनलफैक्टरी का उपयोग करने का मुख्य बिंदु डब्ल्यूसीएफ क्लाइंट कॉन्फ़िगरेशन जानकारी से छुटकारा पाना था। नीचे दिए गए नमूना कोड में, आप कॉन्फ़िगर किए बिना डब्लूसीएफ क्लाइंट को कैसे प्राप्त कर सकते हैं।

Dim fixedAddress = "net.tcp://server/service.svc/mex"
Dim availableBindings = MetadataResolver.Resolve(GetType(ContractAssembly.IContractName), New EndpointAddress(fixedAddress))
factoryService = New ChannelFactory(Of ContractAssembly.IContractName)(availableBindings(0))
accesService = factoryService.CreateChannel()

मेरे अंतिम प्रोजेक्ट में, उपलब्ध होने पर netBcp या net.pipe का उपयोग करने के लिए उपलब्ध बाइंडिंग की जांच की जाती है। इस तरह, मैं अपनी जरूरतों के लिए सर्वोत्तम उपलब्ध बाध्यकारी का उपयोग कर सकता हूं। मैं केवल इस तथ्य पर भरोसा करता हूं कि सर्वर पर मेटाडेटा एंडपॉइंट मौजूद है।

आशा है कि ये आपकी मदद करेगा

बीटीडब्ल्यू, यह .NET 3.5 का उपयोग करके किया जाता है। हालांकि यह 4.0 के साथ भी काम करता है।


यह सिर्फ समय बचाया नहीं है। WSDL जेनरेट प्रॉक्सी का उपयोग करना खतरनाक है क्योंकि यदि आप सेवा संदर्भ को अपडेट करना भूल जाते हैं तो आप समाधान को असंगत स्थिति में छोड़ सकते हैं। सब कुछ संकलित करता है लेकिन सेवा अनुबंध टूट जाता है। जब भी संभव हो, मैं निश्चित रूप से चैनलफैक्टरी का उपयोग करने का सुझाव देता हूं, आप अपना जीवन अधिक आसान बनाते हैं।

एक संभावित विकल्प एक प्रीबिल्ड स्क्रिप्ट लिखना हो सकता है जो आपके प्रोजेक्ट को हर बार प्रॉक्सी बनाने के लिए SVCUtil उपयोगिता को कॉल करता है, लेकिन फिर भी चैनलफैक्टरी बहुत अधिक स्वच्छ और सुरुचिपूर्ण है।





channelfactory