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:
Adja meg azokat a hibafeltételeket, amelyekről a szolgáltatás ügyfélének tudnia kell.
A SOAP-hibák egyéni tartalmának meghatározása ezekhez a hibafeltételekhez.
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, MathFault
amely 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ú MathFault
hibá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 Action
Code
é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
- FaultContractAttribute
- DataContractAttribute
- DataMemberAttribute
- Szerződések és szolgáltatások hibáinak megadása és kezelése
- Hibák küldése és fogadása
- Útmutató: Hibák deklarálása a szolgáltatási szerződésekben
- A védelmi szint ismertetése
- Útmutató: A ProtectionLevel tulajdonság beállítása
- Adatátvitel megadása a szolgáltatási szerződésekben