Вложенное исключение как тип возврата для службы 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 вопроса сейчас:
- Как я могу сделать так, чтобы любой тип исключения мог быть возвращен без необходимости объявлять каждый возможный тип как атрибут ServiceKnownType?
- Можно ли вернуть вложенные исключения с произвольными типами InnerException?
1 ответ
Вы можете определенно перехватить все исключения и превратить их в FaultException. По крайней мере, ваш код не рухнет. Еще один метод заключается в реализации IErrorHandler в вашем классе обслуживания и предоставлении исключения ошибки. Посмотрите на это поведение IErrorHandler.