Как оказалось, System.ServiceModel.Diagnostics.CallbackException
- это внутренний класс, встроенный в небольшую известную сборку под названием "% SystemRoot% \ Microsoft.net \ Framework \ v3.0 \ Windows Communication Foundation \ SMDiagnostics.dll", которая сама содержит только внутренние классы. Ну, это воняет, потому что это означает, что мы никогда не сможем поймать это исключение. Однако я смог найти класс / метод, который создает вышеупомянутое исключение (System.ServiceModel.Diagnostics.ExceptionUtility.ThrowHelperCallback (Exception innerException)), и обнаружил, что он вызывается виртуальным методом OnFapted () внутри CommunicationObject. Поэтому теоретически любой класс, производный от 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>