Compartir a través de


Definición y especificación de errores

Los errores de SOAP transmiten información de condición de error desde un servicio a un cliente y, en caso de comunicación dúplex, desde un cliente a un servicio de una manera interoperable. Este tema describe cuando y cómo definir el contenido del error personalizado y especificar qué operaciones pueden devolverlos. Para obtener más información sobre cómo un servicio o cliente dúplex, puede enviar esos errores y cómo un cliente o la aplicación de servicio administra estos errores, consulte Envío y recepción de errores. Para obtener información general de control de errores en aplicaciones Windows Communication Foundation (WCF), vea Especificación y administración de errores en contratos y servicios.

Información general

Los errores de SOAP declarados son aquéllos en los que una operación tiene System.ServiceModel.FaultContractAttribute que especifica un tipo de error de SOAP personalizado. Los errores de SOAP no declarados son aquéllos que no se especifican en el contrato para una operación. Este tema le ayuda a identificar esas condiciones de error y crear un contrato de error para su servicio, que los clientes pueden utilizar para administrar correctamente esas condiciones de error cuando sean notificadas por errores de SOAP personalizados. Las tareas básicas son, en orden:

  1. Defina las condiciones que un cliente de su servicio debería saber.

  2. Defina el contenido personalizado de los errores de SOAP para esas condiciones de error.

  3. Marque sus operaciones para que los errores de SOAP específicos que inician se expongan a los clientes en WSDL.

Definir Condiciones de error que los clientes deberían saber

Los errores de SOAP son mensajes descritos públicamente que llevan información de error para una operación determinada. Dado que se describen junto con otros mensajes de la operación en WSDL, los clientes saben y, por consiguiente, esperan controlar dichos errores al invocar una operación. Sin embargo, dado que los servicios WCF se escriben en código administrado, decidir qué condiciones de error en código administrado se convertirán en errores y se devolverán al cliente le proporciona la oportunidad de separar las condiciones de error y errores en su servicio de la conversación del error formal que usted tiene con un cliente.

Por ejemplo, el ejemplo de código siguiente muestra una operación que toma dos enteros y devuelve otro entero. Aquí, se pueden producir varias excepciones, por lo que al diseñar el contrato del error, debe determinar qué condiciones de error son importantes para su cliente. En este caso, el servicio debería detectar la excepción 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(ByVal a As Integer, ByVal b As Integer) _
       As Integer
      If (b==0) Then 
            Throw New Exception("Division by zero!")
      Return a/b
    End Function
End Class

En el ejemplo anterior, la operación puede devolver un error de SOAP personalizado, específico de dividir por cero, un error personalizado específico a las operaciones de matemática, pero con información específica a dividir por cero, varios errores para varias situaciones de error diferentes, o ningún error de SOAP en absoluto.

Definir el contenido de condiciones de error

Una vez identificada una condición de error como una que puede devolver un error de SOAP personalizado de forma útil, el paso siguiente es definir los contenidos de ese error y garantizar que se puede serializar la estructura de contenido. El ejemplo de código de la sección anterior muestra un error específico en una operación Divide, pero si hay otras operaciones en el servicio Calculator, a continuación, un error de SOAP personalizado único puede informar el cliente de todas las condiciones de error de la calculadora, Divide incluido. El ejemplo de código siguiente muestra la creación de un error de SOAP personalizado, MathFault, que puede notificar los errores realizados utilizando todas las operaciones de matemática, incluso Divide. Mientras que la clase puede especificar una operación (la propiedad Operation ) y un valor que describe el problema (la propiedad ProblemType ), la clase y estas propiedades deben ser serializables para ser transferidas al cliente en un error de SOAP personalizado. Por consiguiente, System.Runtime.Serialization.DataContractAttribute y los atributos System.Runtime.Serialization.DataMemberAttribute se utilizan para hacer el tipo y sus propiedades serializables y tan interoperable como sea posible.

' 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
// 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; }
    }

}

Para obtener más información sobre cómo asegurarse de que sus datos son serializables, consulte Especificación de transferencia de datos en contratos de servicio. Para obtener una lista de soporte de serialización que System.Runtime.Serialization.DataContractSerializer ofrece, consulte Tipos admitidos por el serializador de contrato de datos.

Marcar operaciones para establecer el contrato de error

Una vez definida una estructura de datos serializable que se devuelve como parte de un error de SOAP personalizado, el último paso es marcar su contrato de operación como iniciar un error de SOAP de ese tipo. Para ello, utilice el atributo System.ServiceModel.FaultContractAttribute y pase el tipo del tipo de datos personalizado que ha construido. El ejemplo de código siguiente muestra cómo usar el atributo FaultContractAttribute para especificar que la operación Divide puede devolver un error de SOAP del tipo MathFault. Otras operaciones basadas en matemáticas, ahora, también pueden especificar que pueden devolver un MathFault.

<OperationContract()> _
<FaultContract(GetType(MathFault))> _
Function Divide(ByVal n1 As Integer, ByVal n2 As Integer) As Integer
[OperationContract]
[FaultContract(typeof(MathFault))]
int Divide(int n1, int n2);

Una operación puede especificar que devuelve más de un error personalizado marcando esa operación con más de un atributo FaultContractAttribute.

El paso siguiente, implementar el contrato de error en su implementación de la operación, se describe en el tema Envío y recepción de errores.

SOAP, WSDL y consideraciones de la interoperabilidad

En algunas circunstancias, sobre todo al interoperar con otras plataformas, puede ser importante para controlar la manera en que aparece un error en un mensaje SOAP o la manera en el que se describe en los metadatos de WSDL.

El atributo FaultContractAttribute tiene una propiedad Name que permite controlar el nombre del elemento de error WSDL que se genera en los metadatos para ese error.

Según la norma de SOAP, un error puede tener Action, Codey Reason. Action es controlado por la propiedad Action. La propiedad Code y la propiedad Reason son ambas propiedades de la clase System.ServiceModel.FaultException, que es la clase primaria del System.ServiceModel.FaultException genérico. Una propiedad Code incluye un miembro SubCode.

Cuando se tiene acceso a los no servicios que generan los errores, existen ciertas limitaciones. WCF solo admite los errores con tipos de datos que describen el esquema y que son compatibles con los contratos de datos. Por ejemplo, tal y como se ha mencionado, WCF no admite errores que utilizan los atributos XML en sus tipos de datos o errores con más de un elemento de nivel superior en la sección de datos.

Vea también

Tareas

Cómo declarar errores en contratos de servicios
Cómo: Establecer la propiedad ProtectionLevel

Referencia

FaultContractAttribute
DataContractAttribute
DataMemberAttribute

Conceptos

Especificación y administración de errores en contratos y servicios
Envío y recepción de errores
Descripción de los niveles de protección
Especificación de transferencia de datos en contratos de servicio