2011-06-03 11 views
6

मैं एक WCF सेवा है, जो कुछ शर्तों के अधीन एक AggregateException देता है, सभी समस्याओं का है कि कॉलAggregateException और WCF

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

जोड़ा इस अनुबंध

[FaultContract(typeof(AggregateException))] 
फिर सेवा कॉल पर

को ..

try 
{ 
    BaseService.Blabla.Delete(item); 
} 
catch (AggregateException ex) 
{ 
    throw new FaultException<AggregateException>(ex); 
} 

लेकिन दूसरी तरफ, जो इस पर है :

catch (FaultException<AggregateException> ex) 
{ 
    string msg = string.Empty; 
    foreach (var innerException in ex.Detail.InnerExceptions) 
    { 
     msg += innerException + Environment.NewLine; 
    } 
    MessageBox.Show(msg); 
} 
catch (Exception ex) 
{ 
    throw ex; 
} 

इसके बजाय अपवाद कैप्चर स्टेटमेंट में जा रहा है, एक घ इस तरह एक त्रुटि हो रही है (जो स्पष्ट रूप से कुछ यादृच्छिक त्रुटि है, क्योंकि मैं किसी तरह के संबंध मुद्दों की जरूरत नहीं है, और डिबगिंग इस तुरंत वापस लौट, 4 मिनट कभी नहीं पारित):

The socket connection was aborted. This could be caused by an error processing your message or a receive timeout being exceeded by the remote host, or an underlying network resource issue. Local socket timeout was '00:03:59.9939994'. : An existing connection was forcibly closed by the remote host 

मैं क्या याद आ रही है?

+0

आप डीबगर के माध्यम से कदम निर्धारित करने के लिए क्या अपवाद वास्तव में फेंक दिया जा रहा है की कोशिश की है? –

उत्तर

0

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

आप आसानी से इस सामान को ट्रैक और दोष आदि सबसे अच्छा शर्त IErrorHandler, एक बुनियादी कार्यान्वयन है कि मैं आम तौर पर उपयोग करने के निम्नलिखित लाइनों के साथ चला जाता है लागू करने के लिए है में हेरफेर करने की क्षमता है करने में सक्षम होना चाहते हैं:

public class ErrorHandler : IErrorHandler 
{ 
    private readonly Action<Exception> LogException; 
    private readonly Action<Message> LogFault; 

    public ErrorHandler(Action<Exception> logException, Action<Message> logFault) 
    { 
     LogException = logException; 
     LogFault = logFault; 
    } 

    public void ProvideFault(Exception error, MessageVersion version, ref Message fault) 
    { 
     if (error is FaultException) // Thrown by WCF - eg request deserialization problems, can be explicitly thrown in code 
     { 
      LogFault(fault); 
      return; 
     } 

     var faultCode = new FaultCode("UnknownFault"); 
     if (error is ArgumentOutOfRangeException) 
     { 
      faultCode = new FaultCode("ArgumentOutOfRange"); 
     } 

     var action = OperationContext.Current.IncomingMessageHeaders.Action; 
     fault = Message.CreateMessage(version, faultCode, error.Message, action); 
     LogFault(fault); 
    } 

    public bool HandleError(Exception error) 
    { 
     // Logging of exceptions should occur here as all exceptions will hit HandleError, but some will not hit ProvideFault 
     LogException(error); 

     return false; // false allows other handlers to be called - if none return true the dispatcher aborts any session and aborts the InstanceContext if the InstanceContextMode is anything other than Single. 
    } 
} 

नोट करें कि उपरोक्त कोड आपके समेकित अपवाद के लिए बिल्कुल सही नहीं है लेकिन आपको सही रास्ते पर ले जाएगा, यदि आप इस मार्ग पर जाने का विकल्प चुनते हैं तो आपको त्रुटि हैंडलर इंजेक्ट करने की भी आवश्यकता होगी।

1

बुराई यह है कि आपकी गलती का विवरण अपवाद से निकला है। Using custom FaultContract object containing System.Exception causes 'Add Service Reference' to fail पढ़ें - एमएचओ। उदाहरण

  [DataContract] 
     public class AggregateFault 
     {  
       [DataMember]  
       public string Message { get; set; } 
     } 

तो FaultException<AggregateFault > काम करता है के लिए एकदम सही है, लेकिन नहीं FaultException<AggregateException>