質問: .NET Framework 4.5でWCFサービスと、それを利用するクライアントアプリケーションを作っています。 WCFサービスの引数や戻り値に使用するカスタムクラスや列挙型で、`DataMember`属性とか`EnumMember`属性を付け忘れることがあるのですが、このときにクライアント側で発生する例外のメッセージから原因を特定するのが難しく困っています。 戻り値がカスタムクラスで、そのいずれかのプロパティで使用している`enum`のメンバーに`EnumMember`属性を付け忘れると、次のようなエラーが出ます。 Exceptionの型:`System.ServiceModel.CommunicationException` メッセージ:`基礎になる接続が閉じられました: 維持される必要があった接続が、サーバーによって切断されました` ※実際には`TargetInvocationException`が発生しており、その`InnerException`に上記の`CommunicationException`が入っていた。 このメッセージから、データコントラクト周りの属性付け忘れの可能性があることまでは、経験として覚えました。 しかし、どこで何を付け忘れているのかという具体的な原因は、今のところひたすらコードを目視で精査している状況です。 もう少しデバッグをしやすくする手段はないものでしょうか? 例外をToStringした結果を記載しておきます。 `System.Reflection.TargetInvocationException: 呼び出しのターゲットが例外をスローしました。 ---> System.ServiceModel.CommunicationException: 基礎になる接続が閉じられました: 維持される必要があった接続が、サーバーによって切断されました ---> System.Net.WebException: 基礎になる接続が閉じられました: 維持される必要があった接続が、サーバーによって切断されました ---> System.IO.IOException: 転送接続からデータを読み取れません: 既存の接続はリモート ホストに強制的に切断されました。。 ---> System.Net.Sockets.SocketException: 既存の接続はリモート ホストに強制的に切断されました。` ※以下スタックトレースは省略
回答: `wcf`のトレースログを出力するようにconfigファイルを変更し、出力されたログを下記のツールから閲覧すると、より詳しく調べることができるかもしれません。 トレースログ出力の設定方法などは以下のMSDNページに記載があります。 cf. Service Trace Viewer Tool (SvcTraceViewer.exe)