次のリクエスト オブジェクトがあるとします。
[DataContract]
public class MyContract {
[DataMember]
public Guid Token { get; set; }
}
また、WCF サービス定義は次のとおりです。
[ServiceContract]
public interface IMyService {
[OperationContract]
bool Validate(MyContract request);
}
以下を操作に送信すると、目的の応答が得られます。
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:esi="http://mynamespace.com/" xmlns:con="http://mynamespace.com">
<soapenv:Header>
</soapenv:Header>
<soapenv:Body>
<esi:Validate>
<esi:Token>9192ef6a-819f-4a8a-8fde-4125999e33dc</esi:Token>
</esi:Validate>
</soapenv:Body>
</soapenv:Envelope>
無効な Guid を送信すると (これはどのタイプでも発生します)、次の応答が返されます。
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<s:Fault>
<faultcode xmlns:a="http://schemas.microsoft.com/net/2005/12/windowscommunicationfoundation/dispatcher">a:InternalServiceFault</faultcode>
<faultstring xml:lang="en-GB">The server was unable to process the request due to an internal error. For more information about the error, either turn on IncludeExceptionDetailInFaults (either from ServiceBehaviorAttribute or from the <serviceDebug> configuration behavior) on the server in order to send the exception information back to the client, or turn on tracing as per the Microsoft .NET Framework SDK documentation and inspect the server trace logs.</faultstring>
</s:Fault>
</s:Body>
</s:Envelope>
これは良いことですが、私のサービスがデータの何が問題なのかを正確に知っていることを考えると、消費者にとって十分な情報ではありません。
Web 構成設定で完全な例外を公開できます<serviceDebug includeExceptionDetailInFaults="true"/>
が、消費者にとっては情報が多すぎます! コード レベルでエラーをカスタマイズしたいのですが、デシリアライザーに接続する方法がわかりません。カスタム SOAP エラーと FaultContract を処理する方法は知っていますが、これはより低いレベルにあるようです。着信メッセージが CLR メソッドに到達する前に、何らかの方法でインターセプトする必要がありますか? 私が気付いていないこれを行う方法はありますか?