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


Szerződések és szolgáltatások hibáinak megadása és kezelése

A Windows Communication Foundation (WCF) alkalmazások úgy kezelik a hibahelyzeteket, hogy a felügyelt kivételobjektumokat SOAP-hibaobjektumokhoz, a SOAP-hibaobjektumokat pedig felügyelt kivételobjektumokhoz társítják. Az ebben a szakaszban szereplő témakörök azt ismertetik, hogyan tervezhet szerződéseket a hibafeltételek egyéni SOAP-hibákként való felfedéséhez, az ilyen hibák visszaadásának módját a szolgáltatás implementálásának részeként, valamint azt, hogy az ügyfelek hogyan kapják el ezeket a hibákat.

Hibakezelés áttekintése

Minden felügyelt alkalmazásban a feldolgozási hibákat objektumok jelölik Exception . A SOAP-alapú alkalmazásokban, például a WCF-alkalmazásokban a szolgáltatásmódszerek SOAP-hibaüzenetekkel közlik a feldolgozási hibainformációkat. A SOAP-hibák olyan üzenettípusok, amelyek egy szolgáltatásművelet metaadataiban szerepelnek, ezért létrehoznak egy hibaszerződést, amellyel az ügyfelek robusztusabbá vagy interaktívabbá tehetik a műveletet. Emellett, mivel a SOAP-hibák XML-formában vannak kifejezve az ügyfelek számára, ez egy rendkívül interoperábilis típusú rendszer, amelyet bármely SOAP-platform ügyfelei használhatnak, növelve a WCF-alkalmazás elérését.

Mivel a WCF-alkalmazások mindkét típusú hibarendszerben futnak, az ügyfélnek küldött felügyelt kivételadatokat a kivételekből SOAP-hibákká kell konvertálni a szolgáltatásban, el kell küldeni, és a SOAP-hibákból a WCF-ügyfelek hibakivételeivé kell konvertálni. Kétoldalas ügyfelek esetén az ügyfélszerződések a SOAP-hibákat is visszaküldhetik egy szolgáltatásnak. Mindkét esetben használhatja az alapértelmezett szolgáltatáskivételi viselkedést, vagy explicit módon szabályozhatja, hogy a kivételek le vannak-e képezve a hibaüzenetekre.

Kétféle SOAP-hiba küldhető el: deklarált és be nem jelentett. A deklarált SOAP-hibák azok, amelyekben egy művelet egy egyéni SOAP-hibatípust meghatározó attribútummal rendelkezik System.ServiceModel.FaultContractAttribute . A be nem jelentett SOAP-hibák nincsenek megadva a műveletre vonatkozó szerződésben.

Erősen ajánlott, hogy a szolgáltatásműveletek az attribútum használatával FaultContractAttribute deklarálják a hibáikat az összes OLYAN SOAP-hiba formális meghatározásához, amelyet az ügyfél a művelet normál során kaphat. Azt is javasoljuk, hogy a SOAP-hiba esetén csak azokat az információkat adja vissza, amelyeket az ügyfélnek tudnia kell az információk közzétételének minimalizálása érdekében.

A szolgáltatások (és kétoldalas ügyfelek) általában a következő lépéseket követik a hibakezelés alkalmazásba való sikeres integrálásához:

  • Kivételfeltételek leképezése egyéni SOAP-hibákra.

  • Az ügyfelek és szolgáltatások kivételként SOAP-hibákat küldenek és fogadnak.

Emellett a WCF-ügyfelek és -szolgáltatások hibakeresési célokra is használhatnak be nem jelentett szappanhibákat, és kiterjeszthetik az alapértelmezett hiba működést. A következő szakaszok ezeket a feladatokat és fogalmakat ismertetik.

A SOAP-hibák kivételeinek leképezése

A hibafeltételeket kezelő művelet létrehozásának első lépése, hogy eldöntse, milyen feltételek mellett kell tájékoztatni az ügyfélalkalmazást a hibákról. Egyes műveletek a működésükhöz kapcsolódó hibafeltételekkel rendelkeznek. Előfordulhat például, hogy egy PurchaseOrder művelet konkrét információkat ad vissza azoknak az ügyfeleknek, akik már nem kezdeményezhetnek vásárlási megrendelést. Más esetekben, például egy Calculator szolgáltatásban, egy általánosabb MathFault SOAP-hiba képes lehet a teljes szolgáltatás összes hibafeltételének leírására. Miután azonosította a szolgáltatás ügyfeleinek hibafeltételeit, létrehozhat egy egyéni SOAP-hibát, és a művelet megjelölhető az adott SOAP-hiba visszaadásaként a megfelelő hibaállapot felmerülésekor.

A szolgáltatás vagy ügyfél fejlesztésének ezen lépésével kapcsolatos további információkért lásd : Hibák meghatározása és megadása.

Az ügyfelek és szolgáltatások kivételként kezelik a SOAP-hibákat

A WCF-alkalmazások sikeres hibakezelésének első lépése a műveleti hibafeltételek azonosítása, az egyéni SOAP-hibák meghatározása és a műveleteknek a hibák visszaadásaként való megjelölése. A következő lépés ezeknek a hibáknak a elküldése és fogadása megfelelő megvalósítása. A szolgáltatások általában hibákat küldenek, hogy tájékoztassák az ügyfélalkalmazásokat a hibafeltételekről, de a kétoldalas ügyfelek SOAP-hibákat is küldhetnek a szolgáltatásoknak.

További információ: Hibák küldése és fogadása.

Be nem jelentett SOAP-hibák és hibakeresés

A deklarált SOAP-hibák rendkívül hasznosak robusztus, interoperábilis, elosztott alkalmazások létrehozásához. Bizonyos esetekben azonban hasznos lehet, ha egy szolgáltatás (vagy kétoldalas ügyfél) be nem jelentett SOAP-hibát küld, amely nem szerepel a webszolgáltatások leírási nyelvében (WSDL) az adott művelethez. Egy szolgáltatás fejlesztésekor például váratlan helyzetek fordulhatnak elő, amelyekben hibakeresési célokra hasznos az információk visszaküldése az ügyfélnek. Emellett beállíthatja a tulajdonságot vagy a ServiceBehaviorAttribute.IncludeExceptionDetailInFaults ServiceDebugBehavior.IncludeExceptionDetailInFaults tulajdonságot, hogy true a WCF-ügyfelek információt kapjanak a belső szolgáltatásműveleti kivételekről. Az egyes hibák küldését és a hibakeresési viselkedés tulajdonságainak beállítását a Hibák küldése és fogadása című cikk ismerteti.

Fontos

Mivel a felügyelt kivételek közzétehetik a belső alkalmazásadatokat, beállíthatják ServiceBehaviorAttribute.IncludeExceptionDetailInFaults vagy ServiceDebugBehavior.IncludeExceptionDetailInFaults engedélyezhetik, hogy true a WCF-ügyfelek információt szerezzenek a belső szolgáltatásműveleti kivételekről, beleértve a személyazonosításra alkalmas vagy más bizalmas információkat is.

Ezért a beállítás vagy ServiceDebugBehavior.IncludeExceptionDetailInFaults a beállítás ServiceBehaviorAttribute.IncludeExceptionDetailInFaults true csak a szolgáltatásalkalmazások ideiglenes hibakeresésének módjaként javasolt. Ezenkívül egy olyan metódus WSDL-értéke, amely így kezeletlen felügyelt kivételeket ad vissza, nem tartalmazza a FaultException<TDetail> típus szerződését ExceptionDetail. Az ügyfeleknek egy ismeretlen SOAP-hiba (a WCF-ügyfeleknek objektumként System.ServiceModel.FaultException visszaadott) lehetőségére kell számítaniuk a hibakeresési információk megfelelő beszerzéséhez.

Hibakezelés testreszabása az IErrorHandlerrel

Ha speciális követelmények vonatkoznak arra, hogy a válaszüzenetet testre szabja az ügyfélre, amikor alkalmazásszintű kivétel történik, vagy a válaszüzenet visszaadása után egyéni feldolgozást hajt végre, implementálja a System.ServiceModel.Dispatcher.IErrorHandler felületet.

Hiba szerializálási problémák

Hibaszerződés deszerializálásakor a WCF először megkísérli egyeztetni a SOAP üzenetben szereplő hibaszerződés nevét a hibaszerződés típusával. Ha nem talál pontos egyezést, akkor a kompatibilis típushoz betűrendben keres a rendelkezésre álló hibaszerződések listájában. Ha két hibaszerződés kompatibilis típusok (például az egyik a másik alosztálya), a hibás típus használható a hiba szerializálásának megszüntetésére. Ez csak akkor fordul elő, ha a hibaszerződés nem ad meg nevet, névteret és műveletet. A probléma előfordulásának megakadályozása érdekében mindig teljes mértékben minősítse a hibaszerződéseket a névtér, a névtér és a műveleti attribútumok megadásával. Ha több kapcsolódó tartalékszerződést is definiált egy megosztott alaposztályból, mindenképpen jelöljön meg új tagokat a következővel [DataMember(IsRequired=true)]: . Az attribútummal kapcsolatos IsRequired további információkért lásd: DataMemberAttribute. Ez megakadályozza, hogy az alaposztály kompatibilis típus legyen, és kényszerítse a hibát a megfelelő származtatott típusra való deszerializálásra.

Lásd még