Я пытаюсь централизовать обработку исключений в моей службы 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" />