Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Приложения 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 в виде исключений
Определение условий ошибки операции, определение пользовательских ошибок 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. Это позволит предотвратить совместимость базового класса и принудительно десериализировать ошибку в правильный производный тип.