Určování a zpracování chyb v kontraktech a službách

Aplikace wcf (Windows Communication Foundation) zpracovávají chybové situace mapováním spravovaných objektů výjimek na objekty selhání PROTOKOLU SOAP a objekty chyb SOAP na spravované objekty výjimek. Témata v této části popisují, jak navrhovat kontrakty tak, aby zobrazovaly chybové stavy jako vlastní chyby SOAP, jak tyto chyby vracet jako součást implementace služby a jak klienti takové chyby zachytí.

Přehled zpracování chyb

Ve všech spravovaných aplikacích jsou chyby zpracování reprezentovány Exception objekty. V aplikacích založených na protokolu SOAP, jako jsou aplikace WCF, metody služby komunikují se zpracováním informací o chybách pomocí chybových zpráv PROTOKOLU SOAP. Chyby PROTOKOLU SOAP jsou typy zpráv, které jsou součástí metadat pro operaci služby, a proto vytvořte kontrakt chyb, který můžou klienti použít k zajištění robustnější nebo interaktivní operace. Vzhledem k tomu, že chyby PROTOKOLU SOAP jsou vyjádřeny klientům ve formátu XML, jedná se o vysoce interoperabilní systém typů, který mohou klienti na jakékoli platformě SOAP používat, což zvyšuje dosah vaší aplikace WCF.

Vzhledem k tomu, že aplikace WCF běží v obou typech chybových systémů, musí být všechny informace o spravovaných výjimkách odeslané klientovi převedeny z výjimek na chyby PROTOKOLU SOAP ve službě, odeslány a převedeny z chyb SOAP na výjimky selhání v klientech WCF. V případě duplexních klientů můžou klientské kontrakty také odesílat chyby PROTOKOLU SOAP zpět do služby. V obou případech můžete použít výchozí chování výjimek služby, nebo můžete explicitně řídit, zda a jak – výjimky se mapují na chybové zprávy.

Je možné odeslat dva typy chyb SOAP: deklarováno a nedeklarováno. Deklarované chyby SOAP jsou chyby, ve kterých má operace System.ServiceModel.FaultContractAttribute atribut, který určuje vlastní typ chyby SOAP. Nedelarované chyby PROTOKOLU SOAP nejsou zadány ve smlouvě pro operaci.

Důrazně doporučujeme, aby operace služby deklarovaly své chyby pomocí atributu FaultContractAttribute k formálnímu určení všech chyb SOAP, které klient může očekávat, že bude v normálním průběhu operace přijímat. Doporučuje se také vrátit v chybě PROTOKOLU SOAP pouze informace, které klient musí znát, aby se minimalizovalo zpřístupnění informací.

Služby (a duplexní klienti) obvykle pomocí následujících kroků úspěšně integrují zpracování chyb do svých aplikací:

  • Namapovat podmínky výjimek na vlastní chyby SOAP

  • Klienti a služby odesílají a přijímají chyby PROTOKOLU SOAP jako výjimky.

Klienti a služby WCF navíc můžou pro účely ladění používat nedelarované chyby soap a můžou rozšířit výchozí chování chyb. Tyto úlohy a koncepty jsou popsány v následujících částech.

Mapování výjimek na chyby PROTOKOLU SOAP

Prvním krokem při vytváření operace, která zpracovává chybové stavy, je rozhodnout, za jakých podmínek by měla být klientská aplikace informována o chybách. Některé operace mají chybové podmínky specifické pro jejich funkce. Operace může například PurchaseOrder vrátit konkrétní informace zákazníkům, kteří už nemají oprávnění zahájit nákupní objednávku. V jiných případech, jako Calculator je například služba, může být obecnější MathFault chyba SOAP schopna popsat všechny chybové stavy v celé službě. Jakmile jsou identifikovány chybové stavy klientů vaší služby, je možné vytvořit vlastní chybu SOAP a operaci lze označit jako vrácenou chybu SOAP, když nastane odpovídající chybový stav.

Další informace o tomto kroku vývoje služby nebo klienta naleznete v tématu Definování a určení chyb.

Klienti a služby zpracovávají chyby PROTOKOLU SOAP jako výjimky

Identifikace chybových podmínek operací, definování vlastních chyb SOAP a označení těchto operací jako vrácení těchto chyb jsou prvními kroky při úspěšném zpracování chyb v aplikacích WCF. Dalším krokem je správné implementace odesílání a přijímání těchto chyb. Služby obvykle odesílají chyby, které informují klientské aplikace o chybových podmínkách, ale duplexní klienti mohou také odesílat chyby PROTOKOLU SOAP do služeb.

Další informace naleznete v tématu Odesílání a příjem chyb.

Nedelarované chyby protokolu SOAP a ladění

Deklarované chyby SOAP jsou velmi užitečné pro vytváření robustních, interoperabilních distribuovaných aplikací. V některých případech je však užitečné, aby služba (nebo duplexní klient) odeslala nedelarovanou chybu SOAP, která není zmíněna v jazyce WSDL (Web Services Description Language) pro danou operaci. Například při vývoji služby může dojít k neočekávaným situacím, ve kterých je užitečné pro účely ladění odesílat informace zpět klientovi. Kromě toho můžete vlastnost nebo ServiceDebugBehavior.IncludeExceptionDetailInFaults vlastnost nastavit ServiceBehaviorAttribute.IncludeExceptionDetailInFaults tak, aby true klienti WCF získali informace o výjimkách interních operací služby. Jak odesílání jednotlivých chyb, tak nastavení vlastností chování ladění jsou popsány v části Odesílání a příjem chyb.

Důležité

Vzhledem k tomu, že spravované výjimky můžou zpřístupnit interní informace o aplikaci, nastavení ServiceBehaviorAttribute.IncludeExceptionDetailInFaults nebo ServiceDebugBehavior.IncludeExceptionDetailInFaultstrue umožnit klientům WCF získat informace o výjimkách operací interní služby, včetně identifikovatelných osobních nebo jiných citlivých informací.

Proto se nastavení ServiceBehaviorAttribute.IncludeExceptionDetailInFaults nebo ServiceDebugBehavior.IncludeExceptionDetailInFaults doporučení true doporučuje pouze jako způsob, jak dočasně ladit aplikaci služby. Kromě toho WSDL pro metodu, která vrací neošetřené spravované výjimky tímto způsobem neobsahuje kontrakt pro FaultException<TDetail> typ ExceptionDetail. Klienti musí očekávat, že je možné správně získat informace o ladění neznámou chybou SOAP (vrácenou klientům WCF jako System.ServiceModel.FaultException objekty).

Přizpůsobení zpracování chyb pomocí IErrorHandler

Pokud máte zvláštní požadavky na přizpůsobení zprávy odpovědi klientovi, pokud dojde k výjimce na úrovni aplikace nebo provedení vlastního zpracování po vrácení zprávy odpovědi, implementujte System.ServiceModel.Dispatcher.IErrorHandler rozhraní.

Problémy se serializací chyb

Při deserializaci kontraktu chyby WCF se nejprve pokusí spárovat název kontraktu chyby ve zprávě SOAP s typem kontraktu chyby. Pokud nenajde přesnou shodu, vyhledá seznam dostupných kontraktů chyb v abecedním pořadí pro kompatibilní typ. Pokud jsou dva kontrakty chyb kompatibilní (jeden je podtřídou jiného), může být k odstranění chyby použit nesprávný typ. K tomu dochází pouze v případě, že kontrakt chyby nezadá název, obor názvů a akci. Chcete-li zabránit výskytu tohoto problému, vždy plně kvalifikujte kontrakty chyb zadáním názvu, oboru názvů a atributů akce. Kromě toho pokud jste definovali řadu souvisejících kontraktů chyb odvozených ze sdílené základní třídy, nezapomeňte označit všechny nové členy pomocí [DataMember(IsRequired=true)]. Další informace o tomto IsRequired atributu naleznete v DataMemberAttributetématu . Tím zabráníte, aby základní třída byla kompatibilním typem a vynutila deserializaci chyby do správného odvozeného typu.

Viz také