Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Ошибки SOAP передают сведения об условии ошибки от службы клиенту и в дуплексном случае от клиента к службе в режиме взаимодействия. В этом разделе описывается, когда и как определить пользовательское содержимое сбоя и указать, какие операции могут возвращать их. Дополнительные сведения о том, как служба или дуплексный клиент могут отправлять эти ошибки и как клиент или приложение службы обрабатывает эти ошибки, см. в статье "Отправка и получение сбоев". Общие сведения об обработке ошибок в приложениях Windows Communication Foundation (WCF) см. в разделе "Указание и обработка ошибок в контрактах и службах".
Обзор
Объявленные ошибки SOAP — это те, в которых операция содержит System.ServiceModel.FaultContractAttribute, указывающий на пользовательский тип сбоя SOAP. Необъявленные ошибки SOAP — это те, которые не указаны в контракте для операции. В этом разделе показано, как определить эти условия ошибки и создать контракт сбоя для службы, который клиенты могут использовать для правильной обработки этих условий ошибок при уведомлении пользовательских ошибок SOAP. Ниже приведены основные задачи:
Определите условия ошибки, о которых должен знать клиент вашей службы.
Определите пользовательское содержимое ошибок SOAP для этих условий ошибки.
Добавьте отметки к операциям так, чтобы определенные ошибки SOAP, которые они вызывают, были видны клиентам в WSDL.
Определение условий ошибки, о которых должны знать клиенты
Ошибки SOAP — это общедоступные сообщения, которые содержат сведения об ошибке для определенной операции. Так как они описаны вместе с другими сообщениями об операциях в WSDL, клиенты знают и, следовательно, ожидают обработки таких ошибок при вызове операции. Но поскольку службы WCF пишутся на управляемом коде, у вас есть возможность чётко определить, какие условия ошибок в этом коде следует преобразовать в неисправности и вернуть клиенту. Это позволяет вам разграничить ошибки и баги в вашей службе от официального обсуждения ошибок с клиентом.
Например, в следующем примере кода показана операция, которая принимает два целых числа и возвращает другое целое число. Здесь могут возникнуть несколько исключений, поэтому при разработке контракта на обработку ошибок необходимо определить, какие условия ошибки важны для клиента. В этом случае служба должна обнаружить System.DivideByZeroException исключение.
[ServiceContract]
public class CalculatorService
{
[OperationContract]
int Divide(int a, int b)
{
if (b==0) throw new Exception("Division by zero!");
return a/b;
}
}
<ServiceContract> _
Public Class CalculatorService
<OperationContract> _
Public Function Divide(a As Integer, b As Integer) As Integer
If b = 0 Then Throw New DivideByZeroException("Division by zero!")
Return a / b
End Function
End Class
В предыдущем примере операция может вернуть пользовательскую ошибку SOAP, которая специфична для деления на ноль, пользовательскую ошибку, относящуюся к математическим операциям, но содержащую сведения, специфичные для деления на ноль, несколько ошибок для различных ситуаций или вообще не вернуть ошибки SOAP.
Определение содержимого условий ошибки
После определения условия ошибки, которое может быть полезно для возврата индивидуальной ошибки SOAP, следующий шаг — определить содержимое этой ошибки и убедиться, что структура содержимого может быть сериализована. В примере кода в предыдущем разделе показано сообщение об ошибке, относящееся к операции Divide, но если в службе существуют другие операции Calculator, то одна пользовательская ошибка SOAP может сообщить клиенту обо всех условиях ошибки калькулятора, включая Divide. В следующем примере кода показано создание пользовательского сбоя SOAP, MathFaultкоторое может сообщать об ошибках, выполненных с помощью всех математических операций, включая Divide. Хотя класс может указать операцию (Operation свойство) и значение, описывающее проблему (ProblemType свойство), класс и эти свойства должны быть сериализуемыми, чтобы их можно было передать клиенту в пользовательском сбое SOAP. Таким образом, атрибуты System.Runtime.Serialization.DataContractAttribute и System.Runtime.Serialization.DataMemberAttribute используются для обеспечения сериализуемости типа и его свойств, а также их максимальной совместимости.
// Define a math fault data contract
[DataContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public class MathFault
{
private string operation;
private string problemType;
[DataMember]
public string Operation
{
get { return operation; }
set { operation = value; }
}
[DataMember]
public string ProblemType
{
get { return problemType; }
set { problemType = value; }
}
}
' Define a math fault data contract
<DataContract([Namespace]:="http://Microsoft.ServiceModel.Samples")> _
Public Class MathFault
Private m_operation As String
Private m_problemType As String
<DataMember()> _
Public Property Operation() As String
Get
Return m_operation
End Get
Set(ByVal value As String)
m_operation = value
End Set
End Property
<DataMember()> _
Public Property ProblemType() As String
Get
Return m_problemType
End Get
Set(ByVal value As String)
m_problemType = value
End Set
End Property
End Class
Дополнительные сведения о том, как убедиться, что данные сериализуются, см. в разделе "Указание передачи данных в контрактах служб". Список поддержки сериализации, которая System.Runtime.Serialization.DataContractSerializer предоставляет, см. в разделе "Типы, поддерживаемые сериализатором контракта данных".
Отметка операций для установления контракта на случай неисправности
После определения сериализуемой структуры данных, возвращаемой как часть пользовательского сбоя SOAP, последний шаг — указать в контракте операции возможность генерации ошибки SOAP этого типа. Для этого используйте атрибут System.ServiceModel.FaultContractAttribute и передайте тип созданного пользовательского типа данных. В следующем примере кода показано, как использовать FaultContractAttribute атрибут, чтобы указать, что Divide операция может возвращать ошибку SOAP типа MathFault. Другие математические операции теперь также могут указывать, что они могут возвращать MathFault.
[OperationContract]
[FaultContract(typeof(MathFault))]
int Divide(int n1, int n2);
<OperationContract()> _
<FaultContract(GetType(MathFault))> _
Function Divide(ByVal n1 As Integer, ByVal n2 As Integer) As Integer
Операция может указать, что она возвращает несколько пользовательских ошибок, пометив операцию несколькими атрибутами FaultContractAttribute.
Следующий шаг, чтобы реализовать контракт на ошибки при реализации операции, описан в разделе "Отправка и получение сбоев".
Рекомендации по протоколу SOAP, WSDL и взаимодействию
В некоторых случаях, особенно при взаимодействии с другими платформами, может быть важно контролировать способ появления сбоя в сообщении SOAP или способе его описания в метаданных WSDL.
Атрибут FaultContractAttribute имеет Name свойство, позволяющее контролировать имя элемента сбоя WSDL, созданное в метаданных для этой ошибки.
В соответствии со стандартом SOAP, ошибка может иметь Action, Code и Reason.
Action управляется свойством Action. Свойства Code и Reason являются свойствами класса System.ServiceModel.FaultException, который является родительским классом обобщённого System.ServiceModel.FaultException<TDetail>. Свойство Code включает в себя SubCode элемент.
При доступе к неслужбам, которые создают ошибки, существуют определенные ограничения. WCF поддерживает только ошибки с детальными типами, которые описывает схема и которые совместимы с контрактами данных. Например, как упоминалось выше, WCF не поддерживает ошибки, использующие XML-атрибуты в их типах подробностей, или ошибки с несколькими элементами верхнего уровня в разделе сведений.
См. также
- FaultContractAttribute
- DataContractAttribute
- DataMemberAttribute
- Указание и обработка ошибок в контрактах и службах
- Отправка и получение неисправностей
- Практическое руководство. Объявление ошибок в контрактах служб
- Основные сведения об уровне защиты
- Практическое руководство. Установка свойства ProtectionLevel
- Указание передачи данных в контрактах служб