Поделиться через


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

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

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

Во всех управляемых приложениях обработка ошибок представлена объектами Exception. В приложениях, основанных на протоколе SOAP, таких как WCF, методы службы передают информацию об ошибке обработки с помощью сообщений об ошибке протокола 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. Например, при разработке службы могут произойти непредвиденные ситуации, в которых для отладки понадобится отправить информацию обратно клиенту. Кроме того, для свойства System.ServiceModel.ServiceBehaviorAttribute.IncludeExceptionDetailInFaults или System.ServiceModel.Description.ServiceDebugBehavior.IncludeExceptionDetailInFaults можно задать значение true, чтобы разрешить клиентам WCF получать информацию о внутренних исключениях операции службы. Отправка отдельных ошибок и установка свойств поведения при отладке описаны в разделе Сбои при отправке и получении.

ms733721.Important(ru-ru,VS.100).gif Примечание
Управляемые исключения могут предоставлять внутренние сведения о приложении, поэтому присвоение свойству System.ServiceModel.ServiceBehaviorAttribute.IncludeExceptionDetailInFaults или System.ServiceModel.Description.ServiceDebugBehavior.IncludeExceptionDetailInFaults значения true позволяет клиентам WCF получать информацию о внутренних исключениях операции службы.

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

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

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

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

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

См. также

Справочник

FaultException
FaultContractAttribute
FaultException
XmlSerializer
XmlSerializerFormatAttribute
FaultContractAttribute
CommunicationException
Action
Code
Reason
SubCode
IsOneWay

Основные понятия

Определение и задание сбоев