У меня много устаревшего кода, который теперь является бэкэндом для службы REST WCF - раньше это был обычный бэкэнд службы WCF, если это имело значение.Я хочу реализовать механизм, который бы ловил любое исключение в любом методе и анализировал его.Если это окажется известной ошибкой, она будет обработана и превращена в дружескую ошибку.
Я знаю, что могу выдать FaultException
или WebProtocolException
вместо «обычных» исключений, ноЕсть много мест, где исключения генерируются по всему коду, и поиск их всех является довольно болезненным вариантом.
Я попытался добавить расширение поведения конечной точки, которое создает новое поведение, которое переопределяет стандарт WebHttpBehavior.AddServerErrorHandlers
метод и добавляет мои обработчики ошибок (IErrorHandler
реализации) в коллекцию обработчиков ошибок диспетчера конечных точек.Внутри обработчиков ошибок я анализирую исключение и создаю (или не создаю) искомую ошибку, основываясь на этом исключении.
Я ожидал, что этот механизм будет возвращать пользовательские данные для любого известного исключения, но я ошибся.Старый добрый Microsoft реализовал замечательный неизбежный WebHttpBehavior2
, который безоговорочно добавляет внутренний Microsoft.ServiceModel.Web.WebErrorHandler
в конец коллекции обработчиков ошибок диспетчера конечных точек.Этот обработчик игнорирует все ранее выполненные обработчики и распознает только небольшой набор исключений, в то время как большинство интерпретируется как «Внутренняя ошибка сервера», и ничего более.
Вопрос в том, нахожусь ли я на правильном пути и есть лиспособ отключить этот обработчик в механизме WCF REST или ввести его с новым исключением (например, когда любое исключение перехватывается, оно сначала обрабатывается моими обработчиками, и если они выдают / возвращают, например, FaultException, то это новоеисключение предоставляется Microsoft.ServiceModel.Web.WebErrorHandler
вместо исходного).Если все мои эксперименты с IErrorHandler
и расширениями поведения бесполезны, какова альтернатива?Опять же, я действительно не хочу изменять логику выдачи исключений, я хочу, чтобы одно место ловило исключения и обрабатывало их.
Большое спасибо!