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