Вложенное исключение как тип возврата для службы WCF

У меня есть служба AC# WCF со следующим определением интерфейса:

    [ServiceContract]
    [ServiceKnownType(typeof(Exception))]
    [ServiceKnownType(typeof(ArgumentException))]
    [ServiceKnownType(typeof(ArgumentNullException))]
    public interface IDataExchangeService
    {
        [OperationContract]
        Exception DoSomething(bool someParam);
    }

Как видите, метод должен возвращать NULL (когда выполнение метода было успешным) или исключение, содержащее произвольное сообщение об ошибке. Метод уже объявлен с атрибутами ServiceKnownType, чтобы избежать ошибок при возврате экземпляра исключения клиенту. Это работает, только если тип возвращаемого исключения равен одному из объявленных ServiceKnownTypes и если InnerException равно NULL. Однако, если я возвращаю исключение, которое имеет, например, ArgumentException в качестве InnerException, я получаю сообщение об ошибке, говорящее, что тип ArgumentException неизвестен:

There was an error while trying to serialize parameter http://tempuri.org/:DoSomething. The InnerException message was 'Type 'System.ArgumentNullException' with data contract name 'ArgumentNullException:http://schemas.datacontract.org/2004/07/System' is not expected. Consider using a DataContractResolver if you are using DataContractSerializer or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to the serializer.'.

У меня есть 2 вопроса сейчас:

  1. Как я могу сделать так, чтобы любой тип исключения мог быть возвращен без необходимости объявлять каждый возможный тип как атрибут ServiceKnownType?
  2. Можно ли вернуть вложенные исключения с произвольными типами InnerException?

1 ответ

Вы можете определенно перехватить все исключения и превратить их в FaultException. По крайней мере, ваш код не рухнет. Еще один метод заключается в реализации IErrorHandler в вашем классе обслуживания и предоставлении исключения ошибки. Посмотрите на это поведение IErrorHandler.

Другие вопросы по тегам