事实证明,System.ServiceModel.Diagnostics.CallbackException
是一个内部类填充在一个名为“%SystemRoot%\Microsoft.net\Framework\v3.0\Windows Communication Foundation\SMDiagnostics.dll”的鲜为人知的程序集中,它本身只包含内部类。好吧,这很糟糕,因为这意味着我们永远无法捕获该异常。但是,我能够找到实例化上述异常的类/方法 (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>