2011-06-03 24 views
6

ben belirli koşullar altında çağrı Diğer taraftanAggregateException ve WCF

, ben mantıklı bir FaultException (alıyorum aracılığıyla gerçekleşmiş tüm sorunları ile, bir AggregateException döndüren bir WCF hizmeti arıyorum çünkü WCF sadece bu istisnaları anlar). Sorun şu ki, sözleşme detayı bir istisna değildir. Varsayılan olarak, WCF, AggregateException özel durumlar listesi (InnerExceptions) için ilk özel durumu alır ve bunu içine alır. Yani müşteri tarafında, sadece listenin ilk istisnasını alıyorum. biraz araştırdıktan sonra, ben aşağıdaki yaptı:

Eklendi bu sözleşme servis çağrı üzerine Sonra

[FaultContract(typeof(AggregateException))] 

için ..

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

Ama bu diğer tarafta, üzerinde

:

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; 
} 

Bunun yerine özel durum catch deyimine giriliyor, d (4 dakika geçmesine asla ben bağlantı sorunu yok çünkü, belli ki bazı rasgele hata olduğunu ve bu hemen döner ayıklama) böyle bir hata alıyorum:

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 

i eksik?

+0

aslında atılmış hangi istisna belirlemek için debugger atlama denediniz mi? –

cevap

0

Sorununuz, BaseService kodunu vurmadan önce ortaya çıktığından şüpheleniyorum, bu nedenle aslında bir AggregateException atamadınız. Hangi özel durumun atıldığını belirlemeniz gerekir, en kolay yol sunucuda hata ayıklamasıdır, bir sonraki kolaylaştırma bir günlüğü kaydetmektir.

kolayca bu şeyleri izlemek ve iyi bahis IErrorHandler, aşağıdaki satırlar boyunca genellikle kullanmak gider temel bir uygulamasını uygulamaktır arızaları vb değiştirme yetisine sahip olmak istiyorsanız:

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. 
    } 
} 

Yukarıdaki kod, AggregateException öğesinin tam olarak yerine getirilmediğini, ancak doğru yolda bulunacağını unutmayın, bu rotayı aşmayı seçerseniz, hata işleyicisini de enjekte etmeniz gerekir.