5


1

フォールト例外の詳細としてのカスタム例外

WCFサービスからFaultException内に独自のカスタム例外をスローし、WCFクライアントでキャッチしようとしています。 ただし、クライアント側では、例外は一般的でないFaultExceptionとしてキャッチされ、カスタム例外の詳細は失われます。

私のカスタム例外は:

[Serializable] public class MyCustomException : ApplicationException
{ ... }

投げる方法は次のとおりです。

throw new FaultException(new MyCustomException("foo bar!"));

(インターフェイスのメソッドの上に[FaultContract(typeof(MyCustomException))]]が配置されていることに注意してください)

そして、これが私のクライアントでそれをキャッチしようとする方法です:

...
catch (FaultException mcex)
{
    Console.WriteLine(mcex);
}
 catch (FaultException fex)
{
    Console.WriteLine(fex);
}

私の目標は、上記の最初のcatch節で例外をキャッチすることですが、最終的には2番目のcatch節でキャッチされます。

興味深いのは、MyCustomExceptionをApplicationExceptionに置き換えると、実際にFaultExceptionが適切にキャッチされることです。

問題は、MyCustomExceptionが(DataContractSerializerを介してではなく)Serializableでシリアル化されていることと、WCFへの追加のディレクティブが欠落していることだと推測しています。 ServiceKnownType属性の行に何かありますか? (私はそれを試しましたが、役に立ちませんでした)。

1 Answer


3


はい、サービスコントラクトでフォールトコントラクトとしてそのタイプを指定するまで、一般的なFaultExceptionをキャッチすることはできません。

[ServiceContract]
interface IYourService
{
   [OperationContract]
   [FaultContract(typeof(MyCustomException))]
   SomeReturnValue YourMethodCall(SomeInputValue input);
}

これを一度行うと、クライアント側のコードで特定の一般的に型指定されたFaultExceptionをキャッチして処理できます。

「FaultException」に関するMSDNドキュメントを参照してくださいhttp://blogs.msdn.com/pedram/archive/2008/01/25/ wcf-error-handling-and-some-best-practices.aspx [ブログ投稿]で、WCFエラー処理の背景と参考情報を入手できます。

また、私は常に[DataContract]属性(および[DataMember]でシリアル化するすべてのメンバー)を使用して、自分の障害コントラクトクラスを常に装飾します。

[Serializable]
[DataContract]
public class MyCustomException : ApplicationException
{ ... }