2010-10-12 11 views
6

को पकड़ने के बाद सत्र जारी नहीं करता है मैंने आईआईएस और डब्ल्यूसीएफ क्लाइंट में होस्ट की गई एक साधारण डब्ल्यूसीएफ सेवा बनाई है और यह पता लगाया है कि जब आप wcf सेवा से FaultException पकड़ते हैं और फिर क्लाइंट को कॉल करते हैं। सत्र() माइक्रोसॉफ्ट के नमूनों के रूप में जारी करने के लिए निरस्त()) यह सत्र जारी नहीं करता है और 11 वीं कॉल पर लटकता है।डब्लूसीएफ क्लाइंट प्रॉक्सी का एबॉर्ट() विधि FaultException

WCF सेवा::

[ServiceContract] 
public interface IService1 
{ 
    [OperationContract] 
    string GetData(int value); 
} 


public class Service1 : IService1 
{ 
    public string GetData(int value) 
    { 
     throw new FaultException("Exception is here"); 

     return string.Format("You entered: {0}", value); 
    } 
} 

ग्राहक:

यहाँ उदाहरण है

class Program 
{ 
    static void Main(string[] args) 
    { 
     Service1Client client = null;   

     for(int i = 0; i < 15; i++) 
     { 
      try 
      { 
       client = new Service1Client(); 
       client.GetData(100);     
      } 
      catch (TimeoutException timeoutEx) 
      { 
       Console.WriteLine(timeoutEx); 
       client.Abort(); 
      } 
      catch (FaultException faultEx) 
      { 
       Console.WriteLine(faultEx); 
       client.Abort(); 
      } 
      catch (CommunicationException commEx) 
      { 
       Console.WriteLine(commEx); 
       client.Abort(); 
      } 
     } 
    }    

}

लेकिन आप client.Close साथ client.Abort() की जगह अगर() पकड़ने के लिए (FaultException) तो सब कुछ एक आकर्षण की तरह काम करता है और wcf के 11 वें कॉल के बाद कोई लॉकिंग नहीं है सेवा विधि।

यह क्यों हो सकता है? FaultException पकड़ने के बाद Abort() विधि सत्र को साफ क्यों नहीं करती है?

+2

तुम सिर्फ प्रतिलिपि इसे यहाँ से चिपकाया था? http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/f86c056a-4027-453a-a46c-fc223e03589b/ – oleksii

उत्तर

2

क्या आपने इस तरह से प्रयास किया है, जिसे मैं डब्ल्यूसीएफ को कॉल करने के लिए उपयोग करता हूं?

class Program 
{ 
static void Main(string[] args) 
{ 
    for(int i = 0; i < 15; i++) 
    { 
     using Service1Client client = new Service1Client() 
     { 
     try 
     { 
      client.GetData(100);     
     } 
     catch (TimeoutException timeoutEx) 
     { 
      Console.WriteLine(timeoutEx); 
      client.Abort(); 
     } 
     catch (FaultException faultEx) 
     { 
      Console.WriteLine(faultEx); 
      client.Abort(); 
     } 
     catch (CommunicationException commEx) 
     { 
      Console.WriteLine(commEx); 
      client.Abort(); 
     } 
     finally 
     { 
      client.Close(); 
     } 
     } 
    } 
}    
+0

यह उत्तर अधिक उपयोगी होगा यदि इसमें कोई विधि शामिल है कि आप इस विधि का उपयोग क्यों करते हैं । –

5

दो बातें: जब संचार चैनल एक गलती अवस्था में है

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

tl; डॉAbort() केवल ग्राहक बंद कर देता है। सेवा उदाहरण/सत्र अभी भी जिंदा है।

आप का उपयोग करके संचार चैनल के राज्य के लिए जाँच कर सकते हैं:

ICommunicationObject comObj = ((ICommunicationObject)client); 
if(comObj.State == CommunicationState.Faulted) 
    client.Abort(); 
else 
    client.Close();