Надеюсь, есть некоторые мастера WCF, которые могут обнаружить мою ошибку здесь.WCF IErrorHandler Расширение не возвращается указанный Fault
Я пытаюсь настроить глобальный обработчик ошибок с помощью поведения IErrorHandler на основе поведения в службе RESTful JSON WCF. Метод декорирован как таковой:
[OperationContract]
[WebGet(UriTemplate = "screens/info", ResponseFormat = WebMessageFormat.Json)]
Реализация IErrorHandler является:
public class ErrorHandler : IErrorHandler
{
public void ProvideFault(Exception error,
MessageVersion version,
ref Message fault)
{
var error = new JsonError
{
Message = error.Message,
FaultCode = -1,
StackTrace = error.StackTrace
};
fault = Message.CreateMessage(version,
"",
ideaScreeningError,
new DataContractJsonSerializer(
ideaScreeningError.GetType()));
// tell WCF to use JSON encoding rather than default XML
var wbf = new WebBodyFormatMessageProperty(WebContentFormat.Json);
fault.Properties.Add(WebBodyFormatMessageProperty.Name, wbf);
//Modify response
var rmp = new HttpResponseMessageProperty
{
StatusCode = HttpStatusCode.BadRequest,
StatusDescription = "Bad Request"
};
fault.Properties.Add(HttpResponseMessageProperty.Name, rmp);
}
public bool HandleError(Exception error)
{
return true;
}
}
я могу проверить (с помощью контрольных точек), что расширение вызывается и выполняется должным образом. Когда я смотрю на результат вызова AJAX в браузере, я вижу, что WCF по-прежнему возвращает 500 Internal Server Error, а не данные Fault, которые я указал в обработчике ошибок.
Если я изменяю типы исключений, которые выбрасываются в методе WCF, они отражаются в результате в браузере, поэтому я могу предположить, что WCF делает что-то для обработки Исключения и возвращает что-то внутренне.
Как заставить его остановиться !?
EDIT
Я добавление пользовательского поведения элемента:
public class ErrorBehaviorElement : BehaviorExtensionElement
{
protected override object CreateBehavior()
{
return new ErrorBehavior();
}
public override Type BehaviorType
{
get { return typeof(ErrorBehavior); }
}
}
и поведение:
internal class ErrorBehavior : WebHttpBehavior
{
protected override void AddServerErrorHandlers(ServiceEndpoint endpoint,
EndpointDispatcher endpointDispatcher)
{
// clear default error handlers.
endpointDispatcher.ChannelDispatcher.ErrorHandlers.Clear();
// add the Json error handler.
endpointDispatcher.ChannelDispatcher.ErrorHandlers.Add(
new ErrorHandler());
}
}
Как добавить нового обработчика ошибок в службу? –
@Ladislav - Via web.config с пользовательским элементом BehaviorExtensionElement –
Да, я это понимаю, но меня интересовало ваше обычное поведение. –