2011-03-23 15 views
14

मैं वर्तमान में कुछ इस तरह स्थापित करने के लिए कोशिश कर रहा हूँ: WCF सेवा से कनेक्शन के लिए बाहर लटक और टीसीपी के माध्यम से सुनताएक WCF कॉलबैक चैनल खुला रखते हुए अनिश्चित काल के लिए ग्राहक से/पुनः कनेक्ट हो अगर यह दोष

  • एक सर्वर साइड खिड़कियां एक ग्राहक पक्ष विंडोज सेवा।
  • जब एक कनेक्शन प्राप्त होता है (ग्राहक सेवा पर चेकइन विधि कॉल) सेवा OperationContext.Current.GetCallbackChannel < टी >
  • इस चैनल एक अद्वितीय कुंजी के साथ एक संग्रह में संग्रहीत किया जाता है (के माध्यम से एक कॉलबैक चैनल प्राप्त विशेष रूप से, मैंने कहा कॉलबैक इंटरफ़ेस, चैनल, और एक सूची <ClientConnection> एक संपत्ति जहां उन में से प्रत्येक है)
  • कॉल अब है कि ग्राहक के आधार पर सेवा में पास करने के लिए सक्षम होना चाहिए में कुंजी संग्रहीत अद्वितीय कुंजी

यह काम करता है पहले, लेकिन थोड़ी देर के बाद बंद हो जाता है - मैं अब क्लाइंट को कॉल पास करने में सक्षम नहीं हूं। मुझे लगता है कि ऐसा इसलिए है क्योंकि कनेक्शन आंतरिक रूप से गिरा दिया गया है और मैं एक मृत कनेक्शन के साथ काम करने की कोशिश कर रहा हूं।

कि मन में, मैं निम्नलिखित प्रश्न हैं:

  • मैं कैसे बता WCF मैं उन TCP कनेक्शन अनिश्चित काल के लिए रखने के लिए (या के लिए जब तक संभव हो) करना चाहते हैं?
  • मैं क्लाइंट पक्ष से कैसे जांचूं, सर्वर से मेरा कनेक्शन अभी भी मान्य है या नहीं, इसलिए मैं इसे छोड़ सकता हूं और सर्वर से फिर से चेक कर सकता हूं यदि मेरा कनेक्शन तला हुआ है?

मैं गंदे समाधान के बारे में सोच सकता हूं, लेकिन मुझे उम्मीद है कि यहां कोई मुझे सही तरीके से बताएगा।

+1

हर किसी के लिए बस थोड़ी सी जानकारी - हमने डब्ल्यूसीएफ का उपयोग हमारे समाधान के रूप में नहीं किया क्योंकि हम संभावित रूप से उच्च ट्रैफिक सर्वर एप्लिकेशन लिख रहे हैं और इससे निपटने के लिए बहुत सी चीजें थीं। हम कुछ प्रदर्शन मुद्दों में भाग गए, हमारे सर्वर ऐप बस कुछ बिंदु पर गिर गया। शायद फिक्स करने योग्य, लेकिन हम इसके बजाय RabbitMQ का उपयोग कर समाप्त हो गया। –

+0

खरगोश एमक्यू के उल्लेख के लिए धन्यवाद, मैं उससे परिचित नहीं था। – PaulF

उत्तर

14

जब आप ग्राहक से कनेक्शन स्थापित, आप अपने टीसीपी में दो टाइमआउट मानों बंधन (बंधन है कि आप clientbase < को DuplexClientBase पारित करेंगे> या <>) स्थापित करना चाहिए:

NetTcpBinding binding = new NetTcpBinding(); 
binding.ReceiveTimeout = TimeSpan.FromHours(20f); 
binding.ReliableSession.InactivityTimeout = TimeSpan.FromHours(20f); 

मेरे नमूना का उपयोग करता है टाइमआउट के लिए 20 घंटे, आप जो भी मूल्य आपके लिए समझ में आता है उसका उपयोग कर सकते हैं। फिर डब्ल्यूसीएफ आपके क्लाइंट और सर्वर को इस अवधि के लिए जुड़े रखने का प्रयास करेगा। डिफ़ॉल्ट अपेक्षाकृत संक्षिप्त है (शायद 5 मिनट?) और यह समझा सकता है कि आपका कनेक्शन क्यों गिरा दिया गया है।

जब भी ग्राहक और सर्वर (डब्ल्यूसीएफ स्वयं चैनल छोड़ने सहित) के बीच एक संचार समस्या है, डब्ल्यूसीएफ क्लाइंट में एक दोषपूर्ण घटना उठाएगा, जिसे आप उचित महसूस करने के लिए संभाल सकते हैं। अपने प्रोजेक्ट में, मैं ICommunicationObject करने के लिए अपने DuplexClientBase <> व्युत्पन्न वस्तु डाली गलती घटना पर भी नियंत्रण प्राप्त और इसे आगे एक घटना मेरी कक्षा में अवगत कराया OnFaulted कहा जाता है के लिए करने के लिए:

ICommunicationObject communicationObject = this as ICommunicationObject; 
communicationObject.Faulted += 
    new EventHandler((sender, e) => { OnFaulted(sender, e); }); 

ऊपर कोड स्निपेट में, this है मेरे डब्ल्यूसीएफ क्लाइंट प्रकार का एक उदाहरण, जो मेरे मामले में डुप्लेक्स क्लाइंटबेस <> से लिया गया है। इस घटना में आप जो करते हैं वह आपके आवेदन के लिए विशिष्ट है। मेरे मामले में, एप्लिकेशन एक गैर-महत्वपूर्ण यूआई है, इसलिए यदि कोई डब्ल्यूसीएफ गलती है तो मैं अंत उपयोगकर्ता को एक संदेश बॉक्स प्रदर्शित करता हूं और ऐप बंद कर देता हूं - यह एक अच्छी दुनिया होगी यदि यह हमेशा आसान होता !

+0

ऐसा लगता है कि यह काम कर रहा है। जब मैं परीक्षण कर चुका हूं तो मैं आपको बता दूंगा कि यह कैसे निकलता है! –

+0

क्या आप कृपया बता सकते हैं कि नीचे कोड लिखना है और ऑनफॉल्ट ईवेंट में क्या करना है? मेरा मतलब ग्राहक पक्ष या सर्वर पक्ष पर है जहां त्रुटि होती है! ICommunicationObject संचारObject = यह ICommunicationObject के रूप में; संचारऑब्जेक्ट.फॉल्ट + = नया इवेंट हैंडलर ((प्रेषक, ई) => {ऑनफॉल्ट (प्रेषक, ई);}); – KomalJariwala

+0

@ कोमलजारीवाला संचारऑब्जेक्ट.फॉल्टेड ईवेंट क्लाइंट साइड पर आपके क्लाइंटबेस-व्युत्पन्न ऑब्जेक्ट से उपलब्ध है। मैंने इसे स्पष्ट करने के लिए ऊपर दिए गए उत्तर को संपादित किया है, और सरल कोड को समझाने के लिए मैं अपने स्वयं के ऑनफॉल्ट कार्यान्वयन में भाग सकता हूं। – PaulF

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