WCF

2011-03-17 16 views
16

में सॉकेट डिस्कनेक्ट का पता लगाएं हम एक डब्ल्यूसीएफ सर्वर (.NET 4.0) बना रहे हैं। यह केवल net.tcp परिवहन का उपयोग करेगा।WCF

जब कोई ग्राहक टीसीपी कनेक्शन बंद करता है, तो सर्वर संचार अपवाद को अनचाहे हो जाता है, और समाप्त हो जाता है।

क्यू 1। मैं CommunicationException को कैसे संभाल सकता हूं ताकि सर्वर समाप्त नहीं हो और अन्य क्लाइंट की सेवा जारी रखे?

प्रश्न 2। हैंडलर में, मुझे सत्र के सत्र आईडी को कैसे छोड़ा गया था? मुझे कुछ सत्र-विशिष्ट डेटा साफ़ करने के लिए इसकी आवश्यकता है।

अग्रिम धन्यवाद!

पीएस कनेक्शन इंटरनेट पर है, इसलिए सॉकेट किसी भी समय बंद हो सकता है, इस पर ध्यान दिए बिना कि ग्राहक कृपापूर्वक डिस्कनेक्ट करता है या नहीं।

+0

क्या है कि आप का उपयोग कर रहे वर्गों रहे हैं ? और पढ़ने और लिखने के लिए आप किस वर्ग का उपयोग कर रहे हैं? टीसीपी कनेक्शन को संभालने के लिए कुछ कक्षाएं हैं। बस कुछ नाम देने के लिए, 'सॉकेट', 'टीसीपी क्लाइंट' –

+1

डब्ल्यूसीएफ ढांचे के अंदर गहरे छिपे हुए हैं। कुछ ग्राहकों में, मैं सर्वर से कनेक्ट करने के लिए System.ServiceModel.ChannelFactory जेनेरिक क्लास का उपयोग करता हूं। – Soonts

उत्तर

21

कोई भी डब्ल्यूसीएफ चैनल ICommunicationObject लागू करता है, जो चैनल जीवनकाल के लिए कार्यक्रम प्रदान करता है।

आप Faulted घटना

sessionId OperationContext.Current संपत्ति से हमेशा की तरह पहुँचा जा सकता है बात सुनो चाहिए।

जब अपने ग्राहक चैनल (पहला ऑपरेशन पर), पर्याप्त घटनाओं रजिस्टर खोलें:

OperationContext.Current.Channel.Faulted += new EventHandler(Channel_Faulted); 
OperationContext.Current.Channel.Closed += new EventHandler(Channel_Faulted); 

और:

void Channel_Faulted(object sender, EventArgs e) 
{ 
    Logout((IContextChannel)sender); 
} 

protected void Logout(IContextChannel channel) 
{ 
     string sessionId = null; 

     if (channel != null) 
     { 
      sessionId = channel.SessionId; 
     } 
     [...] 
} 
+2

यह तभी काम करता है जब ग्राहक शानदार ढंग से बंद हो जाता है। यह काम नहीं करता है जब सॉकेट अचानक डिस्कनेक्ट हो जाता है। – Soonts

+3

यदि सॉकेट डिस्कनेक्ट हो गया है, तो आपको एक चैनल फॉल्ट इवेंट प्राप्त करना चाहिए। बंद घटना तब उठाई जाती है जब ग्राहक शानदार ढंग से बंद हो जाता है, जब यह अप्रत्याशित होता है तो दोषपूर्ण होता है (नेटवर्क विफलता के मामले में)। – Eilistraee

+2

ट्रांसफरमोड = "स्ट्रीम किया गया" – gordy

-1
ICommunicationObject obj = (ICommunicationObject)callback; 
       obj.Closed += new EventHandler((a, b) => 
       { 
        if (list.Exists(cli => cli.CallbackService == (ITecnobelRemoteServiceCallback)a)) 
        { 
         var query = (from cc in list where cc.CallbackService == (ITecnobelRemoteServiceCallback)a select cc).ToList(); 
         query.ForEach(
          delegate (Client ccc) 
          { 
           ccc.CallbackService = null; 
          }); 
        } 

       }); 

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