Megosztás a következőn keresztül:


Hibák meghatározása és megadása

A SOAP-hibák egy szolgáltatásból egy ügyfélnek, kétoldalas esetben pedig egy ügyfélről egy szolgáltatásra, interoperábilis módon továbbítják a hibaállapot-információkat. Ez a témakör azt ismerteti, hogy mikor és hogyan definiálhat egyéni hibatartalmakat, és megadhatja, hogy mely műveletek adhatják vissza azokat. Ha többet szeretne tudni arról, hogy egy szolgáltatás vagy kétoldalas ügyfél hogyan küldheti el ezeket a hibákat, és hogy egy ügyfél- vagy szolgáltatásalkalmazás hogyan kezeli ezeket a hibákat, olvassa el a Hibák küldése és fogadása című témakört. A Windows Communication Foundation (WCF) alkalmazások hibakezelésének áttekintéséért lásd: Szerződések és szolgáltatások hibáinak megadása és kezelése.

Áttekintés

A deklarált SOAP-hibák azok, amelyekben egy művelet System.ServiceModel.FaultContractAttribute egyéni SOAP-hibatípust határoz meg. A be nem jelentett SOAP-hibák azok, amelyek nincsenek megadva a műveletre vonatkozó szerződésben. Ez a témakör segít azonosítani ezeket a hibafeltételeket, és létrehozni egy hibaszerződést a szolgáltatáshoz, amellyel az ügyfelek megfelelően kezelhetik ezeket a hibafeltételeket, amikor egyéni SOAP-hibákról értesülnek. Az alapfeladatok sorrendje:

  1. Adja meg azokat a hibafeltételeket, amelyekről a szolgáltatás ügyfélének tudnia kell.

  2. A SOAP-hibák egyéni tartalmának meghatározása ezekhez a hibafeltételekhez.

  3. Jelölje meg a műveleteket úgy, hogy az általuk kidobott SOAP-hibák ki legyenek téve a WSDL-ügyfelek számára.

Olyan hibafeltételek meghatározása, amelyekről az ügyfeleknek tudniuk kell

A SOAP-hibák olyan nyilvánosan leírt üzenetek, amelyek egy adott művelet hibainformációit hordozzák. Mivel ezeket a WSDL más műveleti üzeneteivel együtt írják le, az ügyfelek tudják, és ezért várhatóan kezelni fogják az ilyen hibákat egy művelet meghívásakor. Mivel azonban a WCF-szolgáltatások felügyelt kódban vannak megírva, annak eldöntése, hogy a felügyelt kód mely hibafeltételeit kell hibákká konvertálni, és vissza kell adni az ügyfélnek, lehetővé teszi a szolgáltatás hibafeltételeinek és hibáinak elkülönítését az ügyféllel folytatott hivatalos hibabeszélgetéstől.

Az alábbi példakód például egy olyan műveletet mutat be, amely két egész számot vesz igénybe, és egy másik egész számot ad vissza. Itt több kivétel is előfordulhat, ezért a hibaszerződés tervezésekor meg kell határoznia, hogy mely hibafeltételek fontosak az ügyfél számára. Ebben az esetben a szolgáltatásnak észlelnie kell a kivételt 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

Az előző példában a művelet egy olyan egyéni SOAP-hibát adhat vissza, amely a nullával való osztásra vonatkozik, egy olyan egyéni hibát, amely a matematikai műveletekre jellemző, de a nullával való osztásra vonatkozó információkat tartalmaz, több hibát több különböző hibahelyzethez, vagy egyáltalán nem tartalmaz SOAP-hibát.

A hibafeltételek tartalmának meghatározása

Miután azonosítottunk egy olyan hibafeltételt, amely hasznosan visszaadhat egy egyéni SOAP-hibát, a következő lépés a hiba tartalmának meghatározása, és annak biztosítása, hogy a tartalomstruktúra szerializálható legyen. Az előző szakaszban található kód példája egy Divide művelettel kapcsolatos hibát mutat be, de ha a szolgáltatáson más műveletek Calculator is vannak, egyetlen egyéni SOAP-hiba tájékoztathatja az ügyfelet az összes kalkulátor hibafeltételéről. Divide Az alábbi példakód egy egyéni SOAP-hiba létrehozását mutatja be, MathFaultamely az összes matematikai művelet, köztük a Divide. Bár az osztály megadhat egy műveletet (a Operation tulajdonságot) és egy olyan értéket, amely leírja a problémát (a ProblemType tulajdonságot), az osztálynak és ezeknek a tulajdonságoknak szerializálhatónak kell lenniük ahhoz, hogy egy egyéni SOAP-hiba esetén át lehessen adni az ügyfélnek. Ezért a System.Runtime.Serialization.DataContractAttribute típus és tulajdonságai szerializálhatóvá és a lehető legáthatóbbá teszik a típust és System.Runtime.Serialization.DataMemberAttribute tulajdonságait.

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

Az adatok szerializálhatóvá tételével kapcsolatos további információkért tekintse meg az adatátvitel szolgáltatásszerződésekben való megadását ismertető témakört. Az adatszerződés szerializálója által támogatott típusok című témakörben találja a szerializálási támogatás System.Runtime.Serialization.DataContractSerializer listáját.

Műveletek megjelölése a hibaszerződés létrehozásához

Az egyéni SOAP-hiba részeként visszaadott szerializálható adatstruktúra definiálása után az utolsó lépés a műveleti szerződés megjelölése egy ilyen típusú SOAP-hiba dobásaként. Ehhez használja az System.ServiceModel.FaultContractAttribute attribútumot, és adja át a létrehozott egyéni adattípus típusát. Az alábbi példakód bemutatja, hogyan használható az FaultContractAttribute attribútum arra, hogy a Divide művelet egy SOAP típusú MathFaulthibát adjon vissza. Más matematikai műveletek is megadhatják, hogy visszaadhatnak egy 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

Egy művelet több egyéni hibát is megadhat, ha a műveletet egynél FaultContractAttribute több attribútummal jelöli meg.

A következő lépés, a hibaszerződés végrehajtásához a művelet végrehajtásához a Hibák küldése és fogadása című témakör ismerteti.

SOAP, WSDL és együttműködési szempontok

Bizonyos körülmények között, különösen akkor, ha más platformokkal együttműködik, fontos lehet szabályozni, hogy a hiba hogyan jelenik meg egy SOAP-üzenetben, vagy hogy a WSDL metaadatai hogyan írják le.

Az FaultContractAttribute attribútum rendelkezik egy Name tulajdonságmal, amely lehetővé teszi a WSDL hibaelem nevének vezérlését, amely a hiba metaadataiban jön létre.

A SOAP szabvány szerint egy hiba lehet egy , egy ActionCodeés egy Reason. A Action tulajdonság szabályozza Action . A Code tulajdonság és Reason a System.ServiceModel.FaultException tulajdonság az osztály mindkét tulajdonsága, amely az általános System.ServiceModel.FaultException<TDetail>osztály szülőosztálya. A Code tulajdonság tartalmaz egy tagot SubCode .

A hibákat generáló nem szolgáltatások elérésekor bizonyos korlátozások léteznek. A WCF csak a séma által leírt és az adatszerződésekkel kompatibilis részletekkel rendelkező hibákat támogatja. Például, ahogy fentebb említettük, a WCF nem támogatja azokat a hibákat, amelyek XML-attribútumokat használnak a részlettípusokban, vagy a részletek szakaszban egynél több legfelső szintű elemet tartalmazó hibákat.

Lásd még