2009-10-12 13 views
7

गलती है मैं एक डब्ल्यूसीएफ क्लाइंट के लिए एक पुन: कनेक्ट तर्क लागू करने की कोशिश कर रहा हूं। मुझे पता है कि वर्तमान चैनल ने ग़लत स्थिति में प्रवेश करने के बाद आपको एक नया चैनल बनाना होगा। मैं एक चैनल गलती ईवेंट हैंडलर में ऐसा किया:डब्ल्यूसीएफ कॉलबैक चैनल


internal class ServiceClient : DuplexClientBase, IServiceClient 
{ 
    public ServiceClient(ICallback callback, EndpointAddress serviceAddress) 
    : base(callback, MyUtility.GetServiceBinding("NetTcpBinding"), serviceAddress) 
    { 
    // Open the connection. 
    Open(); 
    } 

    public void Register(string clientName) 
    { 
    // register to service 
    } 

    public void DoSomething() 
    { 
    // some code 
    } 
} 

public class ClientApp 
{ 
    private IServiceClient mServiceClient; 

    private ICallback mCallback; 

    public ClientApp() 
    { 
    mServiceClient = new ServiceClient(mCallback, new EndpointAddress("someAddress")); 

    mServiceClient.Register(); 

    // register faulted event for the service client 
    ((ICommunicationObject)mServiceClient).Faulted += new EventHandler(ServiceClient_Faulted); 
    } 

    void ServiceClient_Faulted(object sender, EventArgs e) 
    { 
    // Create new Service Client. 
    mServiceClient = new ServiceClient(mCallback, new EndpointAddress("someAddress")); 

    // Register the EI at Cell Controller 
    mServiceClient.Register(); 
    } 

    public void DoSomething() 
    { 
    mServiceClient.DoSomething(); 
    } 
} 

लेकिन मेरी इकाई परीक्षण में मैं अभी भी एक "संचार वस्तु मिलता है, System.ServiceModel.Channels.ServiceChannel, संचार के लिए इस्तेमाल नहीं किया जा सकता क्योंकि यह गलती में है राज्य "अपवाद।

क्या यह संभव है कि कॉलबैक चैनल अभी भी गलती हो और यदि हाँ, मैं कॉलबैक चैनल को कैसे बदल सकता हूं?

+0

आपके द्वारा निर्दिष्ट किया जा सका जब यह अपवाद चलाता है कि आपके इकाई परीक्षण करता है में मदद करता है? –

+0

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

उत्तर

5

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

कुछ सुझाव: - यदि यह टाइमआउट से संबंधित है, तो आखिरी बार कॉल किया गया था और निरंतर टाइमआउट मान वाला ट्रैक रखें। यदि निष्क्रियता के कारण डब्ल्यूसीएफ कनेक्शन गिरा दिया गया है, तो इसे छोड़ दें और इसे से पहले फिर से तार पर अनुरोध भेजें। - दूसरी बात यह है कि ऐसा लगता है कि आप गलती हैंडलर को दोबारा जोड़ नहीं रहे हैं, जिसका मतलब है कि पहली गलती संभाली जाएगी, लेकिन दूसरी बार जब यह गलती हो जाती है तो यह किसी हैंडलर के बिना गिर जाएगी क्योंकि कोई भी नया जुड़ाव नहीं है।

आशा इस

0

क्या आपने Faulted ईवेंट हैंडलर में mServiceClient.Abort को कॉल करके संचार चैनल को रीसेट करने का प्रयास किया है?

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

मुझे लगता है कि आपको आपका पुनर्प्राप्ति कोड में mCallback वस्तु reinitialize नहीं है। आपको इसे एक नए उदाहरण में असाइन करने की आवश्यकता हो सकती है।

+0

आपकी मदद के लिए धन्यवाद। हां, मैंने पहले यह कोशिश की, लेकिन इससे बहुत मदद नहीं मिली क्योंकि मुझे "संचार ऑब्जेक्ट, सिस्टम। सर्विसमोडेल.चैनल्स। सेवा चैनल, संचार के लिए उपयोग नहीं किया जा सकता क्योंकि यह उपरोक्त वर्णित के बजाय अपरिवर्तित राज्य में है" अपवाद अपवाद। – phatoni

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