2011-12-13 13 views
7

को बंद करता है मुझे कॉलबैक/डुप्लेक्स संचार चैनल बंद करने में समस्याएं/प्रश्न हैं।डब्ल्यूसीएफ कॉलबैक इंटरफेस - चैनल

[ServiceContract(CallbackContract = typeof(IMyInterfaceCallback))] 
public interface IMyInterface 
{ 
    [OperationContract] 
    void StartWork(); 
} 

public interface IMyInterfaceCallback 
{ 
    [OperationContract(IsOneWay = true)] 
    void WorkFeedback(); 
} 

ग्राहक के पक्ष मैं के माध्यम से मेरी WCF इंटरफ़ेस बनाने पर:: यहाँ मेरी प्रोटोटाइप WCF इंटरफ़ेस हैं

DuplexChannelFactory<IMyInterface> dcf = new DuplexChannelFactory<IMyInterface>(implOfIMyInterfaceCallback, customBinding, ea); 
IMyInterface myInterface = dcf.CreateChannel(); 

सर्वर साइड पर मैं तो

OperationContext.Current.GetCallbackChannel<IMyInterfaceCallback>(); 

का उपयोग पुनः प्राप्त करने के कॉलबैक पॉइंटर, जिसका उपयोग तब क्लाइंट के साथ संवाद करने के लिए किया जा सकता है।

मेरे सवालों का अब कर रहे हैं:

  1. कौन संचार चैनल बंद हो जाना चाहिए? क्लाइंट या सर्वर
  2. कौन सी संचार वस्तुओं को बंद करने की आवश्यकता है? मूल इंटरफ़ेस (IMyInterface) या कॉलबैक इंटरफ़ेस (IMyInterfaceCallback) या दोनों।

मैंने सर्वर पक्ष पर कॉलबैक इंटरफ़ेस को बंद करने का प्रयास किया, उस समय जब सर्वर जानता है कि यह और कॉलबैक नहीं करेगा। ICommunicationObject का उपयोग करना :: कॉलबैक इंटरफ़ेस पर बंद करें हालांकि परिणामस्वरूप एक मिनट का अवरोधन ऑपरेशन हुआ।

मेरी राय में ग्राहक पक्ष पर बंद करना सही तरीका नहीं है, क्योंकि क्लाइंट को यह नहीं पता है कि अधिक कॉलबैक होने की उम्मीद है या नहीं।

किसी भी मदद के लिए धन्यवाद। फ्रैंक

पुनश्च: यह एक बहुत ही बुनियादी सवाल हो रहा है, लेकिन अब तक मैं जब गूगल के माध्यम से या stackoverflow में खोज रहा है ...

उत्तर

3

DuplexChannel हुड के नीचे एक TCP कनेक्शन का उपयोग करता है कोई उपयोगी जानकारी मिल गया है, और इस तरह यह एक द्विपक्षीय संचार का अनुकरण करता है। हालांकि, ग्राहक वह है जो हमेशा उस कनेक्शन को खोलता है, इसलिए यह भी बंद करने के लिए जिम्मेदार है (एक टीसीपी सॉकेट में सोचें)। इसलिए, आपको इसे बंद करने के लिए क्लाइंट इंटरफ़ेस IMyInterface (जो IClientChannel से प्राप्त होता है) का उपयोग करना चाहिए।

पाब्लो सम्मान।

6

ग्राहक को सेवा चैनल (सामान्य के रूप में) बंद करना चाहिए।

कॉलबैक चैनल GetCallbackChannel के माध्यम से प्राप्त नहीं मेरे अनुभव में बंद किया जाना चाहिए (मेरा यह संबंधित सवाल देखें: Do I need to Close and/or Dispose callback channels acquired through OperationContext.Current.GetCallbackChannel?)

जब बंद करने चैनल आप वरीय पैटर्न का उपयोग करना चाहिए:

Try 
    channel.Close() 
Catch ex As Exception 
    channel.Abort() 
End Try 

क्योंकि ग्राहक को बंद करने का प्रयास करते समय क्लाइंट (आमतौर पर) यह नहीं जान सकता कि कोई संदेश अभी भी चल रहा है या नहीं, जिसके परिणामस्वरूप अपवाद होगा।

+0

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

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