取扱注意!WCF で例外情報をクライアントに返す方法

前回、WCF の例外処理に関するエントリを書きました。

このエントリで紹介した方法よりも簡単に、例外情報をクライアントに返す方法があります。

ServiceBehavior の IncludeExceptionDetailInFaults プロパティを true にする

たったこれだけ。

コードで書くなら下の通り。

// サービスの実装クラスに ServiceBehavior 属性を付ける
[ServiceBehavior(IncludeExceptionDetailInFaults = true)]
public class FooService : IFooService
{
    public void Foo()
    {
        // 例外が発生する処理を記述
    }
}

構成ファイルで書くなら下の通り。

<system.serviceModel>
    <services>
        <service name="FooService" behaviorConfiguration="FooService_ServiceBehaviors">
            <endpoint contract="IFooService" binding="netNamedPipeBinding"/>
        </service>
    </services>
    <behaviors>
        <serviceBehaviors>
            <behavior name="FooService_ServiceBehaviors" >
                <serviceDebug includeExceptionDetailInFaults="true" />
            </behavior>
        </serviceBehaviors>
    </behaviors>
</system.serviceModel>

これで、クライアント側に FaultException が返ってくるようになります。

try
{
    // サービス呼び出し
    channel.Foo();
}
catch(FaultException<ExceptionDetail> ex)
{
    // エラー処理
    Console.WriteLine(ex.Detail.Message);
}

Detail プロパティから取り出せる ExceptionDetail オブジェクトの中に、サービス側で発生した例外の情報が詰まっています。

デバッグ時には重宝する機能です。