Я в основном реализую интерфейс IErrorHandler
, чтобы поймать все виды исключений из службы WCF и отправить его клиенту, реализовав метод ProvideFault
.Обработка исключений WCF с использованием IErrorHandler
Однако я столкнулся с одним критическим вопросом. Все исключения отправляются клиенту как FaultException
, но это запрещает клиенту обрабатывать определенные исключения, которые он мог определить в службе.
Рассмотрите: SomeException
, который был определен и выброшен в одну из реализаций OperationContract
. Когда исключение, его превращают в вине, используя следующий код:
var faultException = new FaultException(error.Message);
MessageFault messageFault = faultException.CreateMessageFault();
fault = Message.CreateMessage(version, messageFault, faultException.Action);
Это отправить сообщение об ошибке в виде строки, но клиент должен поймать общее исключение, как:
try{...}
catch(Exception e){...}
а не:
try{...}
catch(SomeException e){...}
не только пользовательские исключения, как SomeException, но исключения системы, как InvalidOperationException не могут быть пойманы с помощью вышеописанного процесса.
Любые идеи относительно того, как реализовать это поведение?
какого метод пожар после HandleError? – KumarHarsh
Могу ли я подключить обработчик ошибок только на стороне клиента? Я хочу привязать его к реализации 'ClientBase', а не к уровню обслуживания, возможно ли это? –
Shimmy
Несомненно. Я использую вспомогательный метод, примерно такой: var factory = new ChannelFactory (привязка, endpointAddress); factory.Endpoint.EndpointBehaviors.Add (новый PassthroughExceptionHandlingBehavior()); return factory.CreateChannel(); –