AggregateException и WCF - PullRequest
       1

AggregateException и WCF

6 голосов
/ 03 июня 2011

Я звоню в службу WCF, которая при определенных условиях возвращает AggregateException со всеми проблемами, возникшими в результате вызова

С другой стороны, я получаю FaultException (что имеет смысл,потому что WCF понимает только об этих исключениях).Проблема в том, что Деталь для контракта не является совокупным исключением.По умолчанию WCF получает 1-е исключение для списка исключений AggregateException (InnerExceptions) и инкапсулирует его.Так что на стороне клиента я просто получаю первое исключение из списка.После небольшого исследования я сделал следующее:

Добавил это в контракт

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

Вместо этого он попадает в оператор Exception catch и получает ошибку, подобную этой (которая, очевидно, является некоторой случайной ошибкой, потому что у меня нет проблем с подключением и отладкойэто возвращается немедленно, 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

Что мне не хватает?

Ответы [ 2 ]

1 голос
/ 05 апреля 2012

Зло в том, что ваша ошибка связана с исключением. Читать Использование пользовательского объекта FaultContract, содержащего System.Exception, приводит к сбою «Добавить ссылку на службу» - mho. Например

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

тогда FaultException<AggregateFault > работает отлично, но не FaultException<AggregateException>

0 голосов
/ 21 марта 2012

Я подозреваю, что ваша проблема возникает еще до того, как вы нажмете код BaseService, поэтому вы на самом деле не генерируете AggregateException.Вам нужно определить, какое исключение выдается, самый простой способ - отладка на сервере, следующий простой способ - подключить некоторые записи.

Если вы хотите иметь возможность легко отслеживать этот материал и иметьвозможность манипулировать ошибками и т. д. лучше всего реализовать 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.
    }
}

Обратите внимание, что приведенный выше код точно не будет соответствовать вашей AggregateException, но поможет вамна правильном пути, вам также нужно будет добавить обработчик ошибок, если вы решите пойти по этому маршруту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...