Silverlight3 での WCF エラーの扱い方について
昨日は、わんくま同盟の勉強会に参加していました。ここであった質問に、Silverlight で WCFサービスのエラーを処理するにはどうしたら良いかというものがありました。基本的には、SDKドキュメントに記述があるのですが、なかなか知られていないのかなと思いました。
Silverlight 3で WCFのエラーを処理するには、WCFサービス側でビヘイビアを実装する必要があります。このビヘイビアでは、以下の2つの機能を実装する必要があります。
- HTTPステータスを「200OK」に変更する。
SDKでは、SilverlightFaultMessageInspector.BeforeSendReplyメソッドで行っています。 - ApplyDispatchBehaviorメソッドで、MessageInspectorsにSilverlightFaultMessageInspectorを追加する。
カスタムビヘイビアの準備ができたら、サービス側のエンドポイントビヘイビアに組み込みます。
サービスが出来上がれば、Silverlight側ではCompletedメソッドにエラー処理を組み込めば完了です。この場合は、try catchでエラーを補足するのではなく、イベント引数のErrorプロパティを使用します。「FaultExeption<ExceptionDetail> falut = e.Error as FaultExeption<ExceptionDetail>」のようにFaultExceptionへキャストしてから、Detailプロパティを使ってエラー内容にアクセスすることができるようになります。
WCFサービス側でエラー用のカスタムベヘイビアを作成していない場合は、HTTPステータスが500で返ってきます。この場合は、try catchでエラーを補足できますが、CommunicationExceptionとしか認識することができません。この理由から、HTTPステータスを200OKにする必要があります。Silverlight2の場合も考え方は同じなのですが、 FaultExeptionクラスなどがSilverlight3ほど用意されていませんので、自分で実装する必要がありました。
これらの理由は、Silverlight向けのWCF実装が.NET Framework向けのサブセットであり機能を縮小しているからです。WCFのフルセットであれば、try catchでエラーを補足してSOAP例外を取り出すことができますが、Silverlight向けのサブセットには含まれていないためです。