1

Я применил ClaimsAuthenticaitonManager в своей службе WCF для приема входящих требований из нашей ADFS предприятия и преобразования их в утверждения, связанные с пользователем системы (или генерирование несанкционированного ответа, если пользователь AD не зарегистрировано как часть системы). Эти преобразованные утверждения генерируются путем запроса базы данных приложения, и я хотел бы учесть возможность проблем с сетевым подключением, возвращая статус 503 из метода Authenticate в случае, если база данных не может быть достигнута для преобразования требований.Как обрабатывать ошибки во время ClaimsAuthenticationManager.Authenticate

Во-первых, это разумный подход, и, во-вторых, возможно ли это сделать в этот момент в конвейере запроса и как я могу это сделать?

ответ

1

Правильный способ сделать это в 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

+0

Спасибо за подробный ответ. Я сделаю это сегодня утром. – lsuarez

+0

Этот подход был очень полезен с точки зрения общей обработки ошибок, и конкретный случай преобразования претензий попал в конвейер к обработчику. Некоторые из блогов немного устарели, и внедрение 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

Смежные вопросы