2010-11-30 18 views
16

डिस्कनेक्ट करता है, तो मेरे पास net.tcp डुप्लेक्स चैनेल के साथ एक डब्ल्यूसीएफ स्वयं-होस्ट की गई सेवा है। सर्वर पर मैं एक ग्राहक डिस्कनेक्ट करने के लिए निम्नलिखित चलाएँ:डब्ल्यूसीएफ: सर्वर क्लाइंट-साइड का पता लगाने के लिए कैसे करें यदि सर्वर मुझे

((ICommunicationObject)client.CallbackChannel).Close(); 

यह ठीक काम करता है, लेकिन मैं ग्राहक पर कैसे पता लगा है कि यह डिस्कनेक्ट कर दिया गया हो?

Ive दोनों कॉलबैक की InstanceContext और सर्वर के लिए चैनल पर बंद और गलती-घटनाओं को झुका:

InstanceContext callback = new InstanceContext(callbackImp); 
callback.Closed += new EventHandler(callback_Closed); 

और

((ICommunicationObject)Channel).Closed += new EventHandler(Channel_Closed); 

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

संपादित

मैं सिर्फ महसूस किया कि जब क्लाइंट साइड से डिस्कनेक्ट मैं सेवा अनुबंध में एक तरीका है जिसके IsTerminating = सच के साथ चिह्नित है चलाएँ:

[OperationContract(IsTerminating = true)] 
void Disconnect(); 

मैं लगा यह होगा तब कॉलबैक-अनुबंध पर वही? मैं अपने कॉलबैक करने के लिए एक ही विधि जोड़ने की कोशिश की और यह देखने के सर्वर बिंदु से कॉलबैक चैनल को समाप्त किया था लेकिन मैं अभी भी फ्लॉप क्लाइंट-साइड पर अधिसूचित किया गया ... अजीब

संपादित

मैं इस बारे में कुछ और जानकारी में पता चला:

सर्वर कॉलबैक चैनल रोकता है, एक गलती वापस ग्राहक के लिए यात्रा करता है, ग्राहक दोष और हम ग्राहक पर गलती घटना मिलता है।

जब सर्वर कॉलबैक चैनल बंद करता है, तो क्लाइंट बंद होने तक सत्र अभी भी खुला रहता है।

क्लाइंट चैनल बंद कर देता है तो आप बंद ईवेंट देखेंगे।

इस कथन के अनुसार, सर्वर से कॉलबैकनल को बंद करके बंद-घटना को मोटे तौर पर ट्रिगर नहीं किया गया है, क्लाइंट को इसे बंद करना होगा। तो मैं कॉलबैक की डिस्कनेक्ट-विधि को समाप्त करने में क्लाइंट पर बंद कर सकता था। या मैं कॉलबैक सर्वर-साइड पर एबॉर्ट-विधि का उपयोग कर सकता हूं और कॉलबैक पर डिस्कनेक्ट-विधि का उपयोग करके छोड़ सकता हूं। मैं नहीं जानता कि मैं कौन सा ईमानदारी से preffer। Hmmmm।

संपादित

मैं बीच में बंद करें-दृष्टिकोण के साथ चला गया। यह सबसे तार्किक विधि की तरह लग रहा था और यह वास्तव में अच्छी तरह से काम करता है। क्लाइंट को कॉलबैक-इंस्टेंस कॉन्टेक्स्ट पर फॉल्ट-इवेंट के साथ अधिसूचित किया जाता है। अच्छा लगा।

+0

इसे देखें मुझे एक ही समस्या है http://stackoverflow.com/questions/3986347/wcf-duplex-retrieve-client-connection – Rev

उत्तर

2

मैं बीच में बंद करें-दृष्टिकोण के साथ चला गया। यह सबसे तार्किक विधि की तरह लग रहा था और यह वास्तव में अच्छी तरह से काम करता है। क्लाइंट को कॉलबैक-इंस्टेंस कॉन्टेक्स्ट पर फॉल्ट-इवेंट के साथ अधिसूचित किया जाता है।

1

कॉलबैक चैनल बंद करने से पहले आप केवल कॉलबैक कर सकते हैं क्लाइंट को बता रहे हैं कि आप चैनल बंद कर रहे हैं।

तो बस कोड की इस पंक्ति से पहले:

((ICommunicationObject)client.CallbackChannel).Close(); 
+0

यह – Sentry

+0

काम नहीं करता है कि काम नहीं करता है इसके बारे में कुछ और जानकारी प्रदान करने के बारे में .... मुझे पता है कि यह काम करता है क्योंकि कॉलबैकनल का उपयोग कर कोड चलाने के कुछ प्रोड सॉफ़्टवेयर हैं। 6 साल पहले सटीक कार्यान्वयन को याद न करें, लेकिन इमो, बस यह कह रहा है कि यह काम नहीं करता है और जवाब को कम करने वाला थोड़ा सा बचपन है। –

+0

प्रश्न में संपादन इसे समझाते हैं, कॉलबैक बंद करने से ग्राहक के बारे में सूचित नहीं किया जाएगा। आपको इसे निरस्त करना होगा ताकि ग्राहक को दोषपूर्ण घटना प्राप्त हो। – Sentry