Sdílet prostřednictvím


Definice a určení chyb

Chyby PROTOKOLU SOAP sdělují informace o chybovém stavu ze služby do klienta a v duplexním případě z klienta do služby interoperabilním způsobem. Toto téma popisuje, kdy a jak definovat vlastní obsah chyby a určit, které operace je mohou vrátit. Další informace o tom, jak může služba nebo duplexní klient tyto chyby odesílat a jak klient nebo aplikace služby tyto chyby zpracovává, najdete v tématu Odesílání a přijímání chyb. Přehled zpracování chyb v aplikacích WCF (Windows Communication Foundation) naleznete v tématu Určení a zpracování chyb v kontraktech a službách.

Přehled

Deklarované chyby PROTOKOLU SOAP jsou chyby, ve kterých má operace System.ServiceModel.FaultContractAttribute vlastní typ chyby SOAP. Nedelarované chyby PROTOKOLU SOAP jsou chyby, které nejsou zadány ve smlouvě pro operaci. Toto téma vám pomůže identifikovat tyto chybové stavy a vytvořit kontrakt chyb pro vaši službu, který můžou klienti použít ke správnému zpracování těchto chybových podmínek, když jsou upozorněni vlastními chybami SOAP. Základní úkoly jsou v pořadí:

  1. Definujte chybové stavy, o kterých by měl klient vaší služby vědět.

  2. Definujte vlastní obsah chyb SOAP pro tyto chybové stavy.

  3. Označte operace tak, aby konkrétní chyby SOAP, které vyvolá, byly vystaveny klientům ve WSDL.

Definování chybových podmínek, o kterých by klienti měli vědět

Chyby SOAP jsou veřejně popsané zprávy, které obsahují informace o chybách pro konkrétní operaci. Vzhledem k tomu, že jsou popsány spolu s dalšími provozními zprávami ve WSDL, klienti znají a proto očekávají, že tyto chyby budou zpracovávat při vyvolání operace. Protože jsou ale služby WCF napsané ve spravovaném kódu, při rozhodování o tom, které chybové podmínky ve spravovaném kódu se mají převést na chyby a vrátit se klientovi, získáte možnost oddělit chybové podmínky a chyby ve vaší službě od formální chybové konverzace, kterou máte s klientem.

Následující příklad kódu například ukazuje operaci, která přebírá dvě celá čísla a vrací další celé číslo. Zde může dojít k několika výjimkám, takže při návrhu kontraktu selhání musíte určit, které chybové podmínky jsou pro klienta důležité. V tomto případě by služba měla zjistit System.DivideByZeroException výjimku.

[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

V předchozím příkladu může operace buď vrátit vlastní chybu SOAP specifickou pro dělení nulou, vlastní chybu, která je specifická pro matematické operace, ale obsahuje informace specifické pro dělení nulou, více chyb pro několik různých chybových situací nebo žádná chyba SOAP vůbec.

Definování obsahu chybových podmínek

Jakmile je chybový stav identifikován jako takový, který může užitečně vrátit vlastní chybu SOAP, dalším krokem je definovat obsah této chyby a zajistit, aby struktura obsahu byla serializována. Příklad kódu v předchozí části ukazuje chybu specifickou pro Divide operaci, ale pokud ve službě existují další operace Calculator , může klient informovat klienta o všech chybových podmínkách kalkulačky, Divide včetně. Následující příklad kódu ukazuje vytvoření vlastní chyby SOAP, MathFaultkterá může hlásit chyby provedené pomocí všech matematických operací, včetně Divide. I když třída může zadat operaci ( Operation vlastnost) a hodnotu popisující problém ( ProblemType vlastnost), třída a tyto vlastnosti musí být serializovatelné, aby bylo možné přenést do klienta ve vlastní chybě SOAP. Proto jsou System.Runtime.Serialization.DataContractAttribute použity a System.Runtime.Serialization.DataMemberAttribute atributy jsou použity k tomu, aby typ a jeho vlastnosti serializovatelné a co nej interoperabilní.

// 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

Další informace o tom, jak zajistit serializovatelnost dat, naleznete v tématu Určení přenosu dat v kontraktech služeb. Seznam podpory serializace, která System.Runtime.Serialization.DataContractSerializer poskytuje, naleznete v části Typy podporované serializátorem kontraktu dat.

Označení operací pro vytvoření kontraktu selhání

Jakmile je definována serializovatelná datová struktura vrácená jako součást vlastní chyby SOAP, posledním krokem je označení kontraktu operace jako vyvolání chyby SOAP daného typu. K tomu použijte System.ServiceModel.FaultContractAttribute atribut a předejte typ vlastního datového typu, který jste vytvořili. Následující příklad kódu ukazuje, jak pomocí FaultContractAttribute atributu určit, že Divide operace může vrátit chybu SOAP typu MathFault. Jiné matematické operace nyní mohou také určit, že mohou vrátit 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

Operace může určit, že vrací více než jednu vlastní chybu tím, že tuto operaci označí více než jedním FaultContractAttribute atributem.

Dalším krokem implementace kontraktu selhání v implementaci operace je popsáno v tématu Odesílání a příjem chyb.

Důležité informace o protokolu SOAP, WSDL a interoperabilitě

V některých případech, zejména při spolupráci s jinými platformami, může být důležité řídit způsob zobrazení chyby ve zprávě SOAP nebo způsobem, jakým je popsán v metadatech WSDL.

Atribut FaultContractAttributeName vlastnost, která umožňuje řízení názvu elementu chyby WSDL, který je generován v metadatech pro tuto chybu.

Podle standardu SOAP může mít Actionchyba , Codea , a Reason. Vlastnost Action je řízena Action . Vlastnost Code a Reason vlastnost jsou obě vlastnosti System.ServiceModel.FaultException třídy, což je nadřazená třída obecného System.ServiceModel.FaultException<TDetail>. Tato Code vlastnost zahrnuje člena SubCode .

Při přístupu k jiným službám, které generují chyby, existují určitá omezení. WCF podporuje pouze chyby s typy podrobností, které schéma popisuje a které jsou kompatibilní s kontrakty dat. Jak jsme uvedli výše, WCF například nepodporuje chyby, které ve svých typech podrobností používají atributy XML, nebo chyby s více než jedním prvkem nejvyšší úrovně v části podrobností.

Viz také