2011-01-10 16 views
11

मेरे पास एक डब्ल्यूसीएफ webservice है जो मेरे एएसपी.नेट वेब पेज के लिए डेटा प्रदाता के रूप में कार्य करता है।डब्ल्यूसीएफ सेवा ग्राहकों का पुन: उपयोग

पूरे वेब पेज पर ऑटो-जेनरेट सर्विस क्लाइंट के माध्यम से वेब सेवा में कई कॉल किए जाते हैं।

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

क्या मैं अपनी सेवा क्लाइंट क्लास को वैश्विक या स्थैतिक रूप से उपलब्ध कक्षा बना सकता हूं ताकि मेरे एएसपी.नेट वेब पेज के भीतर सभी कार्य एक ही ग्राहक का उपयोग कर सकें। यह कहीं अधिक कुशल प्रतीत होता है। क्या इस तरह से ऐसा करने में कोई समस्या है? ऐसा करने पर मुझे कोई सलाह लेनी चाहिए?

यदि मैं किसी ग्राहक को एकाधिक अनुरोध करता हूं तो क्या होता है? संभवतः यह सभी तुल्यकालिक है इसलिए इससे कोई फर्क नहीं पड़ता कि मैं इसे 1 या 50 कॉल करता हूं?

धन्यवाद

उत्तर

7

जब सत्र (सुरक्षा संदर्भ या विश्वसनीय सत्र के साथ wsHttp) या कनेक्शन (net.tcp, net.pipe) उन्मुख बाध्यकारी का उपयोग किया जाता है तो आपको संभालना होगा जिस तरह से आप सत्र को संभालना चाहते हैं, उसमें अपनी प्रॉक्सी। इसलिए यदि आप प्रॉक्सी साझा करते हैं, तो सभी कॉल एकल डब्लूसीएफ सत्र में संभाले जाएंगे (डिफ़ॉल्ट रूप से सिंगल सर्विस इंस्टेंस द्वारा संभाला जाता है)। लेकिन आपको अतिरिक्त जटिलता से निपटना होगा जैसे: अनचाहे सेवा अपवाद आपके चैनल को समाप्त कर देगा और क्लाइंट से निम्नलिखित कॉल के परिणामस्वरूप अपवाद होगा।

जब सत्र-रहित HTTP बाध्यकारी (basicHttp, webHttp) का उपयोग किया जाता है तो आप अपनी प्रॉक्सी साझा कर सकते हैं या इसे स्थिर भी बना सकते हैं। प्रत्येक कॉल को अलग से संभाला जाता है, किसी सेवा पर अपवाद चैनल को गलती नहीं करेगा और यह पारदर्शी रूप से reuses opened HTTP persistent connections होगा। लेकिन इसके कारण, नई प्रॉक्सी/चैनल बनाने के लिए कोई बड़ा ओवरहेड नहीं होना चाहिए।

तो मेरा सुझाव है: जब आपको अपने एएसपी.NET एप्लिकेशन में एकल अनुरोध प्रसंस्करण में अपनी सेवा के लिए कई कॉल की आवश्यकता होती है, तो उसी प्रॉक्सी/चैनल का उपयोग करें। लेकिन विभिन्न अनुरोधों के बीच प्रॉक्सी/चैनल साझा न करें।

1

मैं एक ChannelFactory का उपयोग कर अपनी समस्या का समय लग सकता है लगता है। यदि मैं सही हूं ChannelFactory में आपके कनेक्शन का पूल है और चैनलों का दोबारा उपयोग करता है। इसका लाभ यह है कि चैनल हर बार केवल पहले ही नहीं मिलते हैं।

यहां अधिक पढ़ें: ChannelFactory

चैनलों आप चैनल के बाद से कुछ विशेष हैंडलिंग जरूरत निपटाने में अपवाद फेंक कर सकते हैं के निपटान को संभालने के लिए। मैंने इसे संभालने के लिए एक मैपर लिखा था, आप इसके बारे में यहां पढ़ सकते हैं: http://blog.tomasjansson.com/2010/12/disposible-wcf-client-wrapper/

+0

क्या यह एक कनेक्शन के माध्यम से मेरे सभी अनुरोधों को डालने के विरोध में, प्रत्येक अनुरोध के लिए बस एक नया कनेक्शन नहीं बनाएगा? – Chris

+0

मुझे नहीं लगता कि यह प्रत्येक अनुरोध के लिए कनेक्शन बनाता है, यह केवल इसे खोलता है (जब आप खुले कॉल करते हैं) ... लेकिन मैं 100% निश्चित नहीं हूं। मुझे लगता है कि कनेक्शन बनाना वह हिस्सा है जो बहुत अधिक खर्च करता है। इसे आसानी से चेक किया जा सकता है, इस तरह के एक साधारण ग्राहक को लागू करें और दो समान कॉल करें जहां आप कॉल का समय दे रहे हैं। यदि मैं सही हूं तो दूसरी कॉल बहुत तेज होनी चाहिए। –

+0

और आमतौर पर आप ** ** कनेक्शन हमेशा के लिए खुला रखना नहीं चाहते हैं, नियमित प्रवाह खुला कनेक्शन है, कॉल करें और फिर बंद करें। –

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