Udostępnij za pośrednictwem


Definiowanie i określanie błędów

Błędy protokołu SOAP przekazują informacje o stanie błędu z usługi do klienta, a w przypadku dwudupleksu od klienta do usługi w sposób współdziałania. W tym temacie omówiono, kiedy i jak zdefiniować niestandardową zawartość błędów i określić, które operacje mogą je zwrócić. Aby uzyskać więcej informacji na temat sposobu obsługi tych błędów przez usługę lub klienta dwustronnego, można wysłać te błędy i jak klient lub aplikacja usługi obsługuje te błędy, zobacz Wysyłanie i odbieranie błędów. Aby zapoznać się z omówieniem obsługi błędów w aplikacjach programu Windows Communication Foundation (WCF), zobacz Określanie i obsługa błędów w kontraktach i usługach.

Omówienie

Zadeklarowane błędy protokołu SOAP to te, w których operacja ma System.ServiceModel.FaultContractAttribute określony niestandardowy typ błędu PROTOKOŁU SOAP. Błędy protokołu SOAP niezdecydowane to te, które nie zostały określone w umowie dotyczącej operacji. Ten temat ułatwia zidentyfikowanie tych warunków błędu i utworzenie kontraktu błędów dla usługi, którego klienci mogą używać do prawidłowego obsługi tych warunków błędu, gdy są powiadamiane przez niestandardowe błędy protokołu SOAP. Podstawowe zadania są w następującej kolejności:

  1. Zdefiniuj warunki błędu, o których powinien wiedzieć klient usługi.

  2. Zdefiniuj niestandardową zawartość błędów protokołu SOAP dla tych warunków błędu.

  3. Oznacz operacje tak, aby określone błędy protokołu SOAP, które zgłaszają, były widoczne dla klientów w języku WSDL.

Definiowanie warunków błędów, o których powinni wiedzieć klienci

Błędy protokołu SOAP są publicznie opisywane komunikaty, które zawierają informacje o błędach dla określonej operacji. Ponieważ są one opisane wraz z innymi komunikatami operacji w języku WSDL, klienci wiedzą i dlatego oczekują obsługi takich błędów podczas wywoływania operacji. Jednak ponieważ usługi WCF są napisane w kodzie zarządzanym, podjęcie decyzji, które warunki błędu w kodzie zarządzanym mają zostać przekonwertowane na błędy i zwrócone klientowi, daje możliwość oddzielenia warunków błędów i usterek w usłudze od formalnej rozmowy o błędzie z klientem.

Na przykład poniższy przykład kodu przedstawia operację, która przyjmuje dwie liczby całkowite i zwraca inną liczbę całkowitą. W tym miejscu można zgłosić kilka wyjątków, dlatego podczas projektowania kontraktu błędów należy określić, które warunki błędu są ważne dla klienta. W takim przypadku usługa powinna wykryć System.DivideByZeroException wyjątek.

[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

W poprzednim przykładzie operacja może zwrócić niestandardową usterkę protokołu SOAP specyficzną dla dzielenia przez zero, niestandardową usterkę specyficzną dla operacji matematycznych, ale zawierającą informacje specyficzne dla dzielenia przez zero, wiele błędów w kilku różnych sytuacjach błędów lub w ogóle brak błędu protokołu SOAP.

Definiowanie zawartości warunków błędów

Po zidentyfikowaniu warunku błędu jako warunku, który może zwrócić niestandardową usterkę protokołu SOAP, następnym krokiem jest zdefiniowanie zawartości tego błędu i upewnienie się, że struktura zawartości może być serializowana. Przykładowy kod w poprzedniej sekcji przedstawia błąd specyficzny dla Divide operacji, ale jeśli w usłudze istnieją inne operacje Calculator , pojedynczy niestandardowy błąd PROTOKOŁU SOAP może poinformować klienta o wszystkich warunkach błędu kalkulatora, Divide uwzględnionych. Poniższy przykład kodu przedstawia tworzenie niestandardowego błędu protokołu SOAP, MathFaultktóry może zgłaszać błędy wykonywane przy użyciu wszystkich operacji matematycznych, w tym Divide. Klasa może określać operację ( Operation właściwość) i wartość opisjącą problem ( ProblemType właściwość), klasa i te właściwości muszą być serializowalne, aby można było przenieść do klienta w niestandardowym błędzie protokołu SOAP. System.Runtime.Serialization.DataContractAttribute W związku z tym atrybuty i System.Runtime.Serialization.DataMemberAttribute są używane do serializacji typu i jego właściwości oraz jak najbardziej współdziałania.

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

Aby uzyskać więcej informacji na temat sposobu serializacji danych, zobacz Określanie transferu danych w kontraktach usług. Aby uzyskać listę zapewnianej obsługi System.Runtime.Serialization.DataContractSerializer serializacji, zobacz Typy obsługiwane przez serializator kontraktu danych.

Oznaczanie operacji w celu ustanowienia kontraktu błędów

Po zdefiniowaniu struktury danych możliwej do serializacji, która jest zwracana w ramach niestandardowego błędu protokołu SOAP, ostatnim krokiem jest oznaczenie kontraktu operacji jako zgłaszania błędu protokołu SOAP tego typu. W tym celu należy użyć atrybutu System.ServiceModel.FaultContractAttribute i przekazać typ utworzonego typu danych niestandardowych. Poniższy przykład kodu pokazuje, jak użyć atrybutu FaultContractAttribute , aby określić, że Divide operacja może zwrócić błąd PROTOKOŁU SOAP typu MathFault. Inne operacje oparte na matematyce mogą teraz również określać, że mogą zwracać wartość 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

Operacja może określać, że zwraca więcej niż jeden błąd niestandardowy, oznaczając tę operację więcej niż jednym FaultContractAttribute atrybutem.

W następnym kroku, aby zaimplementować kontrakt błędów w implementacji operacji, opisano w temacie Wysyłanie i odbieranie błędów.

Zagadnienia dotyczące współdziałania protokołu SOAP, WSDL i współdziałania

W niektórych okolicznościach, zwłaszcza w przypadku współdziałania z innymi platformami, może być ważne, aby kontrolować sposób, w jaki błąd pojawia się w komunikacie PROTOKOŁU SOAP lub sposób, w jaki został opisany w metadanych WSDL.

Atrybut FaultContractAttribute ma Name właściwość, która umożliwia sterowanie nazwą elementu błędu WSDL wygenerowaną w metadanych dla tego błędu.

Zgodnie ze standardem SOAP, błąd może mieć Action, i CodeReason. Obiekt Action jest kontrolowany Action przez właściwość . Właściwość Code i Reason właściwość są właściwościami System.ServiceModel.FaultException klasy , która jest klasą nadrzędną ogólnego System.ServiceModel.FaultException<TDetail>. Właściwość Code zawiera element członkowski SubCode .

W przypadku uzyskiwania dostępu do usług, które generują błędy, istnieją pewne ograniczenia. Program WCF obsługuje tylko błędy ze szczegółowymi typami, które opisano w schemacie i które są zgodne z kontraktami danych. Na przykład, jak wspomniano powyżej, program WCF nie obsługuje błędów, które używają atrybutów XML w swoich typach szczegółów lub błędów z więcej niż jednym elementem najwyższego poziomu w sekcji szczegółów.

Zobacz też