2016-05-31 2 views
0

Я пытаюсь централизовать обработку исключений в моей службы WCF с помощью ErrorHandler (System.ServiceModel.Dispatcher.IErrorHandler)WCF и пользовательская ошибка?

Это как ProvideFault выглядеть так:

public void ProvideFault(Exception error, MessageVersion version, ref Message fault) 
    { 

     if (error is ValidationHandler) 
     { 
      var val = error as ValidationHandler; 
      var val2 = ErrorHandler.HandleException(val); 
      fault = Message.CreateMessage(version, val2.CreateMessageFault(), "http://ns"); 
     } 
     else if (error is FaultException) 
      fault = Message.CreateMessage(version, (error as FaultException).CreateMessageFault(), "http://ns"); 
     else 
      fault = Message.CreateMessage(version, ErrorHandler.HandleException(error).CreateMessageFault(), "http://ns"); 
    } 

ValidationHandler является System.Exception, но не имеют datacontract атрибут , ValidationHandler содержит список MainValidation, где хранятся все данные, и этот класс украшен атрибутом datacontract.

ErrorHandler.HandleException переведет ValidationHandler к FaultException<MyCustomFault>, который является обычаем FaultException содержащего ExceptionContainer (datacontract), содержащего список MainValidation (datacontract).

Если я удалю IErrorHandler и просто выбрасывает ErrorHandler.HandleExceptio n от сервиса, все работает нормально. Пользователь CustomFault может быть обработан с помощью клиента и проверки.

Но при использовании IErrorHandler ошибка, которая прибывает на клиента, не может быть отправлена ​​на FaultException<MyCustomFault>? Похоже, данные теряются при запуске Message.CreateMessage?

Редактировать 1: Я вижу, что MessageFault, созданные из CreateMessageFault, имеют деталь, и если я передам это в MyCustomFault, я могу правильно прочитать содержимое. Вопрос в том, почему это не учитывается при прибытии к клиенту?

Редактировать 2: Когда исключение приходит к клиенту, я пытаюсь передать его в FaultException, но это возвращает null. Итак, MyCustomFault, кажется, потерян в пути?

Редактировать 3: я следующий набор на поведение в конфигурации:

<serviceDebug includeExceptionDetailInFaults="true" /> 
<serviceMetadata httpGetEnabled="true" /> 

ответ