Правильный способ сделать это в SOF-сервисах WCF - это использовать пользовательский ErrorHandler
. Это тот случай, если вы используете WIF или нет.
Пользовательский обработчик ошибок реализует IErrorHandler
. Это позволяет вашей службе генерировать исключения, которые передаются WCF зарегистрированному пользовательскому обработчику ошибок. Это позволяет проверить исключение и создать соответствующую ошибку.
В вашем случае вы, вероятно, выбросите исключение, которое исходит от вашего SQL-клиента. Помимо создания правильной ошибки, вы также сможете выполнять любое другое релевантное действие (например, обычно регистрируя ошибку).
Два метода на IErrorHandler
является
ProvideFault(Exception error, MessageVersion version, ref Message fault)
который позволяет inpsect выброшенного исключения и изменить или создать правильную ошибку.
И
HandleError(Exception error)
, который вызывается после того, как ответ возвращается клиенту. Здесь вы можете делать такие вещи, как запись ошибки.
Подробнее о том, как осуществить это можно найти на
http://blogs.msdn.com/b/carlosfigueira/archive/2011/06/07/wcf-extensibility-ierrorhandler.aspx
обработчик ошибок может быть легко подключены с помощью кода, как и в приведенной выше ссылке. с небольшой дополнительной работой он может быть подключен с помощью web.config путем реализации пользовательского расширения поведения службы. Пример того, как сделать это можно найти на
http://weblogs.asp.net/pglavich/archive/2008/10/16/wcf-ierrorhandler-and-propagating-faults.aspx
Сказав, что, как правило, для SOAP услуг, вы бы не вернуть код состояния HTTP напрямую (то есть 503 статус). Вместо этого вы завершите ошибку в FaultException
и вернете это.
Для WCF REST, вы бы просто бросить WebFaultException
и встроенный обработчик ошибок для webHttpBinding
будет обрабатывать преобразование в ошибку HTTP:
http://blogs.msdn.com/b/endpoint/archive/2010/01/21/error-handling-in-wcf-webhttp-services-with-webfaultexception.aspx
Спасибо за подробный ответ. Я сделаю это сегодня утром. – lsuarez
Этот подход был очень полезен с точки зрения общей обработки ошибок, и конкретный случай преобразования претензий попал в конвейер к обработчику. Некоторые из блогов немного устарели, и внедрение IErrorHandler как [BehaviorExtensionElement] (http://msdn.microsoft.com/en-us/library/System.ServiceModel.Configuration.BehaviorExtensionElement.aspx) довольно привлекательно. Пример использования используется здесь [здесь] (http: // msdn.microsoft.com/en-us/library/system.servicemodel.dispatcher.ierrorhandler.aspx). – lsuarez