Задание и обработка сбоев в контрактах и службах

Приложения Windows Communication Foundation (WCF) обрабатывают ситуации ошибок путем сопоставления управляемых объектов исключений с объектами сбоя SOAP и объектами сбоя SOAP с управляемыми объектами исключений. В подразделах этого раздела описывается, как разрабатывать контракты, чтобы представлять ошибки в виде пользовательских ошибок SOAP, как возвращать эти ошибки в реализации службы, и как клиенты могут перехватывать такие ошибки.

Общие сведения об обработке ошибок

Во всех управляемых приложениях обработка ошибок представлена объектами Exception. В приложениях на основе SOAP, таких как приложения WCF, методы службы обмениваются сведениями об ошибках обработки с помощью сообщений об ошибках SOAP. Сообщения об ошибках SOAP являются типами сообщения, которые включаются в метаданные, связанные с работой службы, и таким образом создают контракт ошибок, который клиенты могут использовать для повышения надежности и интерактивности своей работы. Кроме того, поскольку ошибки SOAP выражаются клиентами в XML-форме, это система типов с высоким взаимодействием, которую клиенты на любой платформе SOAP могут использовать, увеличивая охват приложения WCF.

Так как приложения WCF выполняются в обоих типах систем ошибок, все управляемые сведения об исключении, отправляемые клиенту, должны быть преобразованы из исключений в ошибки SOAP в службе, отправлены и преобразованы из ошибок SOAP в исключения ошибок в клиентах WCF. В случае дуплексных клиентов клиентские контракты могут отправлять ошибки SOAP обратно в службу. В обоих случаях можно использовать поведения исключений для службы по умолчанию или можно явно управлять тем, будут ли исключения сопоставляться с сообщениями об ошибке и как будет выполняться это сопоставление.

Можно отправить два типа ошибок SOAP: объявленные и необъявленные. Объявленные ошибки SOAP представляют ошибки, в которых в операции имеется атрибут System.ServiceModel.FaultContractAttribute, указывающий пользовательский тип ошибки SOAP. Необъявленные ошибки SOAP не указаны в контракте для операции.

Настоятельно рекомендуется, чтобы операции службы объявляли свои ошибки с помощью атрибута FaultContractAttribute. Это позволит формально указать все ошибки SOAP, которые клиент может получить во время обычной операции. Кроме того, чтобы свести к минимум раскрытие информации, рекомендуется возвращать в ошибке SOAP только те сведения, которые необходимо знать клиенту.

Обычно службы (и дуплексные клиенты) выполняют следующие шаги, чтобы интегрировать обработку в свои приложения.

  • Сопоставление исключений и пользовательскими ошибками SOAP.

  • Клиенты и службы отправляют и получают ошибки SOAP в виде исключений.

Кроме того, клиенты и службы WCF могут использовать необъявленные ошибки soap для отладки и могут расширить поведение ошибки по умолчанию. В следующих разделах рассматриваются эти задачи и принципы.

Сопоставление исключений с ошибками SOAP

Первым шагом в создании операции, обрабатывающей ошибки, является определение условий, при которых клиентское приложение должно быть проинформировано об ошибках. Для некоторых операций имеются ошибки, относящиеся к их функциональности. Например, операция PurchaseOrder может возвратить конкретную информацию клиенту, которому больше не разрешено размещать заказ на покупку. В других случаях, например в службе Calculator, более общая ошибка SOAP MathFault может описать все условия ошибки во всей службе. После определения ошибок клиентов может быть создана пользовательская ошибка SOAP. Кроме того, можно отметить, что операция возвращает данную эту ошибку при возникновении соответствующей ошибки.

Дополнительные сведения об этом шаге разработки службы или клиента см. в разделе "Определение и указание ошибок".

Клиенты и службы обрабатывают ошибки SOAP в виде исключений

Определение условий ошибки операции, определение пользовательских ошибок SOAP и маркировка этих операций как возвращение этих ошибок — это первые шаги в успешной обработке ошибок в приложениях WCF. Следующий шаг заключается в надлежащей реализации отправки и получения этих ошибок. Обычно службы отправляют сообщения об ошибках, чтобы информировать клиентские приложения, но дуплексные клиенты также могут отправлять службам сообщения об ошибках протокола SOAP.

Дополнительные сведения см. в статье Отправка и получение ошибок.

Необъявленные ошибки протокола SOAP и отладка

Объявленные ошибки протокола SOAP очень полезны для построения надежных распределенных приложений с возможностью взаимодействия. Однако в некоторых случаях для службы (или дуплексного клиента) полезно отправлять необъявленную ошибку SOAP, которая не упоминается для данной операции в языке WSDL. Например, при разработке службы могут произойти непредвиденные ситуации, в которых для отладки понадобится отправить информацию обратно клиенту. Кроме того, можно задать ServiceBehaviorAttribute.IncludeExceptionDetailInFaults свойство или ServiceDebugBehavior.IncludeExceptionDetailInFaults свойство, чтобы true разрешить клиентам WCF получать сведения об исключениях внутренних операций службы. Как отправка отдельных ошибок, так и настройка свойств поведения отладки описаны в разделе "Отправка и получение сбоев".

Внимание

Так как управляемые исключения могут предоставлять сведения о внутренних приложениях, параметры ServiceBehaviorAttribute.IncludeExceptionDetailInFaults или ServiceDebugBehavior.IncludeExceptionDetailInFaults разрешить true клиентам WCF получать сведения об исключениях внутренних операций службы, включая личную или другую конфиденциальную информацию.

Присваивать свойству ServiceBehaviorAttribute.IncludeExceptionDetailInFaults или ServiceDebugBehavior.IncludeExceptionDetailInFaults значение true рекомендуется только в качестве временного способа отладки приложения службы. Кроме того, WSDL для метода, который возвращает такие необработанные управляемые исключения, не содержит контракт для исключения FaultException<TDetail> типа ExceptionDetail. Клиенты должны ожидать возможность неизвестного сбоя SOAP (возвращенного клиентам WCF в качестве System.ServiceModel.FaultException объектов) для правильного получения сведений об отладке.

Настройка обработки ошибок с помощью интерфейса IErrorHandler

Если имеются особые требования для настройки ответного сообщения клиента при возникновении исключения на уровне приложения или выполнения специальной обработки после возвращения ответного сообщения, реализуйте интерфейс System.ServiceModel.Dispatcher.IErrorHandler.

Проблемы сериализации сбоя

При десериализации контракта сбоя службы WCF прежде всего пытаются сопоставить имя контракта сбоя в сообщении протокола SOAP с типом контракта сбоя. Если точное соответствие не обнаружено, просматривается список доступных контрактов сбоя в алфавитном порядке для нахождения совместимого типа. Если совместимые типы имеют два контракта сбоя (например, один является подклассом другого), при десериализации сбоя может быть использован неправильный тип. Это происходит только в случае, если в контракте сбоя не указано имя, пространство имен и действие. Во избежание данной проблемы всегда полностью определяйте контракты сбоя, указывая атрибуты имени, пространства имен и действия. Кроме того, если определено несколько родственных контрактов сбоя, производных от общего базового класса, обязательно помечайте все новые элементы атрибутом [DataMember(IsRequired=true)]. Дополнительные сведения об использовании атрибута IsRequired см. в разделе DataMemberAttribute. В этом случае базовый класс не будет считаться совместимым типом, а сбой будет десериализован в правильный производный тип.

См. также