Обработка ошибок в Windows Communication Foundation (WCF)
Есть несколько способов проектирования решений по обработке исключений, когда служба обнаруживает непредвиденное исключение или ошибку. Хотя единого решения по обработке ошибок или "рекомендации" нет, существует несколько допустимых путей, которые следует учитывать. Обычно рекомендуется реализовать гибридное решение, которое объединяет несколько подходов из приведенного ниже списка в зависимости от сложности реализации WCF, типа и частоты исключений, обработанного и необработанного характера исключений, а также любых связанных требований трассировки, ведения журнала или политики.
Эти решения более подробно рассматриваются далее в этом разделе.
Библиотека Microsoft Enterprise
Программный блок обработки исключений библиотеки Microsoft Enterprise помогает реализовать общие принципы проектирования и создать согласованную стратегию обработки исключений, возникающих на всех уровнях архитектуры корпоративного приложения. Он предназначен для поддержки обычного кода, содержащегося в инструкциях CATCH в компонентах приложения. Вместо того чтобы повторять этот код (например, код, который записывает сведения об исключении в журнал) в двух одинаковых блоках CATCH по всему приложению, можно использовать программный блок обработки исключений, который позволяет разработчикам инкапсулировать эту логику в многократно используемых обработчиках исключений.
В состав этой библиотеки входит готовый обработчик исключений контрактов ошибок. Этот обработчик исключений предназначен для использования в границах службы WCF и создает новый контракт сбоя из исключения.
Программные блоки предназначены для встраивания широко используемых методов и обеспечивают общий подход к обработке исключений в пределах всего приложения. С другой стороны, могут быть весьма полезными самостоятельно разрабатываемые пользовательские обработчики ошибок и контракты ошибок. Например, пользовательские обработчики ошибок предоставляют отличную возможность автоматически повысить уровень всех исключений в FaultExceptions, а также добавить возможности ведения журнала в приложение.
Дополнительные сведения см. в библиотеке Microsoft Enterprise Library.
Работа с ожидаемыми исключениями
Правильный курс действия заключается в том, чтобы перехватывать ожидаемые исключения в каждой операции или соответствующей точке расширяемости, решать, можно ли восстановить их из и возвращать правильную пользовательскую ошибку в отказоустойчивом<объекте T>.
Работа с непредвиденными исключениями с помощью IErrorHandler
Чтобы справиться с непредвиденными исключениями, рекомендуемый курс действия заключается в том, чтобы "перехватить" IErrorHandler. Обработчики ошибок перехватывать исключения только на уровне среды выполнения WCF (уровень "модель службы"), а не на уровне канала. Единственным способом подключения IErrorHandler на уровне канала является создание пользовательского канала, что в большинстве случаев делать не рекомендуется.
"Неожиданное исключение", как правило, не является неустранимым исключением или исключением обработки; Вместо этого это неожиданное исключение пользователя. Неустранимое исключение (например, исключение вне памяти) — одно обычно обрабатывается обработчиком исключений модели службы автоматически , обычно не может обрабатываться корректно, и единственная причина обработки такого исключения вообще может быть выполнена дополнительным ведением журнала или возвратом стандартного исключения клиенту. Исключение при обработке возникает при обработке сообщения, например на уровне сериализации, кодировщика или модуля форматирования. Как правило, его нельзя обработать с помощью IErrorHandler, поскольку на момент возникновения таких исключений вмешательство обработчика обычно происходит либо слишком рано, либо слишком поздно. Аналогичным образом с помощью IErrorHandler нельзя обрабатывать исключения транспорта.
С помощью IErrorHandler можно явно управлять поведением приложения, когда возникает исключение. Вы можете сделать следующее:
Решите, следует ли отправлять клиенту ошибку.
Замените исключение ошибкой.
Замените ошибку другой ошибкой.
Выполнение ведения журнала или трассировки.
Выполнение других пользовательских действий.
Можно установить пользовательский обработчик ошибок путем добавления его в свойство ErrorHandlers диспетчеров каналов для данной службы. Может применяться несколько обработчиков ошибок, и они будут вызываться в порядке добавления в данную коллекцию.
IErrorHandler.ProvideFault управляет отправкой клиенту сообщений об ошибках. Этот метод вызывается независимо от типа исключения, возникшего в результате операции в данной службе. Если операция не выполняется здесь, WCF предполагает его поведение по умолчанию и продолжается, как если бы не было пользовательских обработчиков ошибок.
Одна область, в которой можно использовать этот подход, - если необходимо создать центральное расположение для преобразования исключений в ошибки, прежде чем они будут отправлены клиенту (при условии, что экземпляр не удаляется и канал не переходит в состояние «Ошибка»).
Метод IErrorHandler.HandleError обычно используется для реализации поведения, связанных с ошибками, таких как ведение журнала ошибок, системные уведомления, завершение работы приложения и т. д. IErrorHandler.HandleError можно вызывать в нескольких местах внутри службы, и в зависимости от того, где возникает ошибка, метод HandleError может или не вызываться тем же потоком, что и операция; в этом отношении гарантии не выполняются.
Работа с исключениями за пределами WCF
Часто исключения конфигурации, исключения строки подключения к базам данных и другие подобные исключения могут возникать в контексте приложения WCF, но сами они не являются исключениями, вызываемыми моделью службы или самой веб-службой. Эти исключения являются "обычными" исключениями, внешними для веб-службы, и должны обрабатываться так же, как и другие внешние исключения в среде.
Трассировка исключений
Трассировка — это единственное место "catch-all", где можно увидеть все исключения. Дополнительные сведения о трассировке исключений и занесении их в журналы см. в разделе «Трассировка и ведение журнала».
Ошибки шаблона URI при использовании WebGetAttribute и WebInvokeAttribute
Атрибуты WebGet и WebInvoke позволяют указывать шаблон URI, сопоставляющий компоненты адреса запроса с параметрами операции. Например, шаблон URI «weather/{state}/{city}» сопоставляет адрес запроса с литеральными лексемами, параметром «state» и параметром «city». Затем эти параметры могут быть связаны по имени с некоторым из формальных параметров операции.
Параметры шаблона отображаются в виде строк в пределах URI, тогда как формальные параметры типизированного контракта могут иметь нестроковые типы. Таким образом, преобразование должно происходить до вызова операции. Доступна таблица форматов преобразования.
Однако если преобразование выполнить не удалось, то невозможно сообщить операции, что возникло какое-то нарушение. Вместо этого преобразование типа проявляется в виде сбоев при подготовке к отправке.
Наличие ошибок подготовки к отправке при преобразовании типов можно проверить так же, как многие другие типы ошибок отправки - путем установки обработчика ошибки. Для обработки исключения уровня службы вызывается точка расширения IErrorHandler. Там можно выбрать, будет ли ответ отправлен обратно в вызывающий код, или будут выполнены какие-либо пользовательские задачи или действия с отчетами.