Да, вы можете сериализовать исключения и возвращать их с WCF. Я написал приложение, в котором клиенту WCF было необходимо иметь реальное исключение, которое произошло на сервере; не только ошибка высокого уровня.
Вот шаги для реализации того, что мы сделали:
1 - Объявить класс EncodedException с однострочным свойством
public class EncodedException
{
public string SerializedException {get;set;}
}
2 - в контракте на обслуживание добавьте атрибут, указывающий, что ваша служба может вернуть исключение FaultException.
[ServiceContract()]
public class MyService
{
[OperationContract]
[FaultContract(typeof(EncodedException),
ProtectionLevel = ProtectionLevel.EncryptAndSign)]
public string Method1 ();
}
3 - В вашей реализации сервиса добавьте try / catch во все операции сервиса:
public void Method1()
{
try
{
// some code here
}
catch( Exception ex)
{
EncodedException encodedException = Helper.SerializeException( ex );
throw new FaulException<EncodedException>();
}
}
4 - в коде вашего клиента перехватите исключение и разверните его:
public void someMethod()
{
try
{
serviceClient.Method1();
}
catch( FaulException<EncodedException> ex)
{
Exception decodedException = Helper.DeserializeException( ex );
throw new decodedException();
}
}
5 - Напишите помощнику для сериализации / десериализации исключения. Если вам нужна помощь с этой частью, дайте мне знать.
Надеюсь, это поможет.