FaultContracts を持つことのポイントは、サーバーとクライアントの間の通信チャネルを切断しない (.NET 例外などのエラー状態を適切かつ相互運用的に処理する) サービスからまず SOAP フォールトを返すことができるようにすることです。 FaultContracts を使用すると、サーバーは型指定されたフォールト ( FaultException<T>
) をスローし、クライアントはそれらをキャッチできます。
本当に相互運用できるようにしたい、または必要がある場合は、次のことを行う必要があります。
- すべての FaultContract タイプを [DataContract] 属性で装飾されたクラスとして定義します
- サーバー上のすべての .NET 例外を (IErrorHandler インターフェイスなどを使用して) キャッチし、それらを相互運用可能な SOAP エラーに変換します。
ワイヤの両端を制御し、両端が .NET である場合、これを 1 つのステップで単純化できます。サーバー上で、すべての .NET 例外を処理し、それらを egFaultException<ArgumentOutOfRangeException>
に変換します。つまり、"fault of (whatever . 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....
}