Для вашего текущего проекта это вызвано тем, что Policy
должен содержать хотя бы одно требование.
Не уверен, каково определение для C
, я предлагаю вам реализовать UserRoleCheckRequirement
и переместить C
в UserRoleCheckRequirement
, чтобы вернуть context.Succeed(requirement);
. А затем проверьте AuthenticatedUser
и другую логику авторизации в HandleRequirementAsync
.
Я предполагаю, что Вы используете WCF, так как Ваш вопрос отмечен с ним. Хорошая практика в обработке исключений с WFC не позволяет исключениям пузыриться через провод Вашему потребителю, но бросать значимый FaultExceptions вместо этого.
У Вас должна всегда быть попытка... ловят блок в Вашей операции, если существует шанс, исключение могло бы быть сгенерировано им. Если Вы позволяете сырым данным excption пузыриться, только два сценария могут закончиться: при конфигурировании сервиса для разрешения деталей исключения в отказах, Вы выставите внутренности своего сервиса, открывающего себя для нарушений защиты. Или Вам не настроили это в Вашем сервисе, и потребитель получает очень универсальное сообщение, которое указывает, что что-то пошло не так, как надо, который не очень полезен для них или службы поддержки.
То, что необходимо сделать, объявляют один или несколько FaultExceptions, в зависимости от того, какие сообщения Вы хотите, чтобы пользователь получил от Вашей операции, украсьте их как FaultContracts на Вашем объявлении операции. Затем можно попробовать... выгоду определенные исключения и бросить определенные Отказы. У Вас может также быть попытка... ловят, который ловит исключение, и бросьте очень общий Отказ.
Ключ здесь, не показывает слишком много информации того, что продолжает Вашу операцию внутренне - особенно отслеживания стека!
Отказ является просто другим контрактом данных, таким образом, он объявляется в Вашем WSDL. Это означает, что Ваш потребитель может поймать отказ конкретно и может реагировать на отказы, брошенные от Вашей операции, как будто это было исключение, бросаемое из их кода.
Надеюсь, это поможет.
Joe.
Это в порядке, но попытка просто поймать типы исключительной ситуации, которые можно обработать.
Постарайтесь не ловить любое "Исключение" или, если Вы делаете так, регистрируете и/или предупреждаете пользователя и/или повторяете для вызова веб-сервиса.
Если это - приложение форм окон, я обычно переношу последнюю выгоду "Исключения" в блок ОТЛАДКИ #if, чтобы не скрывать исключения при отладке или тестировании.
#if !DEBUG
catch (Exception ex)
{
// show messagebox, log, etc
}
#endif
Да, необходимо перенести вызов веб-сервиса в выгоду попытки. Не используйте пустую выгоду, поскольку они (главным образом) - чистое зло. Ваш блок выгоды должен, по крайней мере, зарегистрировать исключение. Я не знаю о Вашей логике приложений, но вероятно некоторое сообщение (как "информация от сервиса не был выбран из-за технической ошибки"), должен быть показан пользователю.
Помещение метода веб-сервиса в блоке выгоды попытки является хорошей идеей, поскольку Вы заявили, что не хотите разрушать вызывающее приложение, потому что что-то пошло не так, как надо в методе веб-сервиса.
Кроме того, а не отбросьте исключение назад клиенту, который ничего не может делать с этим так или иначе, можно полагать, что наличие всех методов веб-сервиса возвращает структуру или маленький класс, который может содержать состояние вызова, кода ошибки и дружественного сообщения, которое могло объяснить ошибку.
это - случай, который мог привести к выданному исключению, таким образом, да это должно быть перенесено на блоке выгоды попытки.
Что сделать с обработчиком исключений, он зависит от логики программы...