2011-03-16 15 views
6

मैं इसWCF डुप्लेक्स अनुबंध

[ServiceContract(CallbackContract = typeof(ICallback1), 
SessionMode = SessionMode.Required)] 
public interface IService1 
{ 
    // some methods 
} 

सेवा कार्यान्वयन InstanceContextMode और ICallback1 के लिए InstanceContextMode.Single सेट है जैसे WCF सेवा अनुबंध की तरह

public interface ICallback1 
{ 
    [OperationContract] 
    void Report(int someValue); 
} 

अब क्लाइंट की तरफ कुछ है कहो, मैं हो सकता है एक वर्ग आईसीएलबैक 1 को

class Callback1 : ICallback1 
{ 
    public void Report(int someValue) 
    { 
     // alert client 
    } 
} 
लागू करता है

और मैं इस

Service1Client serviceClient = new Service1Client(new InstanceContext(new CallBack1())); 

जो ठीक काम करता है की तरह ग्राहक सेवा संदर्भ पैदा करते हैं। अब समस्या यह है कि मैं कुछ ग्राहकों है कि कॉलबैक में कोई दिलचस्पी नहीं कर रहे हैं, तो मुझे इस तरह के ग्राहकों के लिए कॉलबैक इंटरफ़ेस को लागू करने की आवश्यकता नहीं है तो मैं लगा तो मैं करने की कोशिश की है इस

Service1Client serviceClient = new Service1Client(null); 

और

Service1Client serviceClient = new Service1Client(new InstanceContext(null)); 

दोनों ने बताया कि parameter cannot be null। मेरा सवाल यह है कि, यदि ग्राहक कॉलबैक में रूचि नहीं रखता है तो मैं कॉलबैक ऑब्जेक्ट को पास किए बिना सेवा संदर्भ कैसे बना सकता हूं। एकमात्र आवश्यकता यह है कि सभी ग्राहकों को एक ही सेवा से बात करनी चाहिए लेकिन अन्यथा मैं सेवा को पुन: स्थापित कर सकता हूं। कोई विचार ?

संपादित करें:

मैं भी SessionMode = SessionMode.Allowed ServiceContract के लिए बजाय SessionMode.Required की कोशिश की है, लेकिन है कि या तो मदद नहीं की।

+0

यह तब तक असंभव दिखता है जब तक यह अनुबंध का हिस्सा न हो। –

+0

क्या कॉलबैक कंट्रैक्ट वैकल्पिक हो सकता है? –

+0

सरल शब्दों में, कॉलबैक को सेवा अनुबंध के हिस्से के रूप में परिभाषित किया जाता है, यह स्थिर है। बाकी सब कुछ कॉन्फ़िगर करना अनुबंध को नहीं बदलेगा, इसलिए यह असंभव दिखता है। –

उत्तर

2

वर्कअराउंड: IService1 से कॉलबैक नियंत्रण निकालें। IDuplexService1 बनाएं जो IService1 को प्राप्त करता है और इसमें कॉलबैक कंट्रैक्ट होता है। Service1Client लागू IDuplexService1 है। मेजबान को तुरंत चालू करते समय, ServiceHost.AddServiceEndpoint पर दोनों IService1 और IDuplexService1 के लिए कॉल करें।

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