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:
Zdefiniuj warunki błędu, o których powinien wiedzieć klient usługi.
Zdefiniuj niestandardową zawartość błędów protokołu SOAP dla tych warunków błędu.
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, MathFault
któ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 Code
Reason
. 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ż
- FaultContractAttribute
- DataContractAttribute
- DataMemberAttribute
- Określanie i obsługa błędów w kontraktach i usługach
- Wysyłanie i odbieranie błędów
- Deklarowanie błędów w kontraktach usługi
- Omówienie poziomów ochrony
- Instrukcje: ustawianie właściwości ProtectionLevel
- Określanie transferu danych w kontraktach usług