Службы WCF REST - общая обработка исключений

У меня много устаревшего кода, который теперь является бэкэндом для службы WCF REST - раньше он был обычным бэкэндом службы WCF, если это важно. Я хочу реализовать механизм, который ловил бы любое исключение в любом методе и анализировал его. Если это окажется известной ошибкой, она будет обработана и преобразована в понятную ошибку.

Я знаю, что могу выбросить FaultException или WebProtocolException вместо ' обычные исключения, но есть много мест, где исключения выбрасываются по всему коду, и поиск всех из них - довольно болезненный вариант.

Я попытался добавить расширение поведения конечной точки, которое создает новое поведение, которое переопределяет стандартное WebHttpBehavior.AddServerErrorHandlers и добавляет мои обработчики ошибок ( IErrorHandler реализации) в коллекцию обработчиков ошибок диспетчера конечных точек. Внутри обработчиков ошибок я анализирую исключение и создаю (или не создаю) желаемую ошибку на основе этого исключения.

Я ожидал, что этот механизм вернет пользовательские данные для любого известного исключения, но я ошибался. Старый добрый Microsoft реализовал замечательный неизбежный WebHttpBehavior2 , который безоговорочно добавляет внутренний Microsoft.ServiceModel.Web. WebErrorHandler в конец коллекции обработчиков ошибок диспетчера конечных точек. Этот обработчик игнорирует все ранее выполненные обработчики и распознает лишь небольшой набор исключений, в то время как большинство из них интерпретируется как «Внутренняя ошибка сервера» и не более того.

Вопрос в том, нахожусь ли я на правильном пути и есть ли способ отключить этот обработчик в механизме WCF REST или ввести его с новым исключением (например, когда какое-либо исключение перехвачено, оно сначала обрабатывается моими обработчиками, и если они выбрасывают / возвращают, например, FaultException, то это новое исключение предоставляется на Microsoft.ServiceModel.Web.WebErrorHandler вместо исходного). Если все мои эксперименты с IErrorHandler и расширениями поведения бесполезны, какова альтернатива? Еще раз, Я действительно не хочу изменять логику генерирования исключений, мне нужно одно место для перехвата исключений и их обработки.

Большое спасибо!

9
задан Michael Sagalovich 16 December 2010 в 13:34
поделиться