Смысл наличия FaultContracts состоит в том, чтобы в первую очередь обеспечить возможность возврата к сбоям SOAP от службы, которые не будут нарушать канал связи между сервером и клиентом (обработка условий ошибок, таких как исключения .NET, изящно и функционально), и, во-вторых, используя FaultContracts, ваш сервер может выбросить типичные ошибки (FaultException<T>
), и ваш клиент может их перехватить.
Если вы хотите или должны быть действительно совместимыми, вам необходимо:
- определить все ваши типы FaultContract как классы, украшенные атрибутом [DataContract]
- перехватывает все исключения .NET на сервере (например, через интерфейс IErrorHandler) и превращает их в совместимые ошибки SOAP
Если вы контролируете оба конца провода и оба конца .NET, то вы можете упростить это за один шаг: на сервере обработайте все исключения .NET и превратите их, например, в. FaultException<ArgumentOutOfRangeException>
, то есть создайте «ошибку (независимо от исключения .NET)», а затем на клиенте перехватите эти напечатанные исключения FaultException и обработайте их:
[FaultContract(typeof(ArgumentOutOfRangeException)]
[OperationContract]
public void CallService(.......)
и затем в своей реализации используйте это:
try
{
clientProxy.CallService();
}
catch(FaultException<ArgumentOutOfRangeException> ex)
{
// handle the most specific exception first
}
catch(FaultException ex)
{
// handle all other, unspecific server faults
}
catch(CommunicationException ex)
{
// handle all other, client-proxy related WCF errors
}
catch(Exception ex)
{
// handle anything else....
}