結局のところ、「%SystemRoot%\Microsoft.net\Framework\v3.0\Windows Communication Foundation\ SMDiagnostics.dll System.ServiceModel.Diagnostics.CallbackException
」と呼ばれるあまり知られていないアセンブリ内に内部クラスが詰め込まれており、それ自体には内部クラスのみが含まれています。ええと、それは、その例外を決してキャッチできないことを意味するため、悪臭を放ちます。しかし、上記の例外 (System.ServiceModel.Diagnostics.ExceptionUtility.ThrowHelperCallback(Exception innerException)) をインスタンス化するクラス/メソッドを突き止めることができ、CommunicationObject 内の仮想メソッド OnFaulted() によって呼び出されていることがわかりました。したがって、理論的には、CommunicationObject から派生したクラス (申し訳ありませんClientBase<T>
) は、そのメソッドをオーバーライドして、ThrowHelperCallback() を呼び出さないように指示できます。つまり、実行可能な唯一の候補は、から派生したクラスです。ChannelFactoryBase<T>
. 理論的には、面倒な CallbackException を抑制する独自のカスタム チャネル ファクトリを実装することもできますが、現時点では作業が多すぎるため、対処する必要があると思います。
編集: @Jeremy - 回線を介して戻ってくる SOAP エンベロープを調べると、予想どおり、一般的なエラーが発生していることがわかりました。これは、CallbackException がシリアル化されていないため、サーバー上で生成されていないことを示しています。
<s:Body>
<s:Fault>
<s:Code>
<s:Value>s:Receiver</s:Value>
<s:Subcode>
<s:Value xmlns:a="http://schemas.microsoft.com/net/2005/12/windowscommunicationfoundation/dispatcher">a:InternalServiceFault</s:Value>
</s:Subcode>
</s:Code>
<s:Reason>
<s:Text xml:lang="en-US">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 3.0 SDK documentation and inspect the server trace logs.</s:Text>
</s:Reason>
</s:Fault>
</s:Body>