Programování

Zpracování výjimek v WCF

Výjimkou jsou chyby, ke kterým dochází za běhu; zpracování výjimek je technika zpracování těchto runtime chyb. K zpracování výjimek byste obvykle použili bloky try, catch a nakonec (známé také jako bloky výjimek) v kódu vaší aplikace. Pokud v kódu aplikace nejsou správně zpracovány výjimky a za běhu došlo k výjimce, spuštění aplikace by skončilo.

Zpracování výjimek v WCF není tak přímočaré - jste omezeni na odesílání objektů .Net přes drát a vaše služba WCF může odesílat pouze serializovaná data, tj. Zprávy SOAP klientovi. Výjimky ve WCF můžete zpracovat jedním z těchto tří způsobů:

  1. Pomocí FaultException
  2. Pomocí IErrorHandler
  3. Pomocí returnUnknownExceptionsAsFaults

V tomto příspěvku představím diskusi o různých způsobech, kterými lze zprávy výjimek přenášet ze služby WCF spotřebitelům služby.

Zvažte tuto jednoduchou službu WCF.

[ServiceContract]

veřejné rozhraní IDBManagerService

    {

[OperationContract]

void Save (Zaměstnanec emp);

    }

Kontrakt služby IDBManagerService obsahuje jednu provozní smlouvu k přetrvávání objektu zaměstnance do databáze.

veřejná třída DBManagerService: IDBManagerService

    {

void Save (zaměstnanec emp)

        {

Snaž se

           {

// Kód pro uložení objektu zaměstnance do databáze

           }

úlovek (výjimka mimo)

           {

vyvolat novou výjimku („Došlo k chybě při ukládání dat ...“);

           }

        }

    }

Nyní předpokládejme, že došlo k chybě při připojování k databázi nebo ukládání objektu zaměstnance do databáze v době, kdy se pokoušíte využívat službu. Potom byste s touto zprávou dostali výjimku: „System.ServiceModel.FaultException: Server nemohl zpracovat požadavek z důvodu interní chyby. Další informace o chybě zapnete na IncludeExceptionDetailInFaults (buď z ServiceBehaviorAttribute nebo z konfigurace chování) na serveru, aby bylo možné odeslat informace o výjimce zpět klientovi, nebo zapnout trasování podle dokumentace Microsoft .Net Framework 3.0 SDK a zkontrolovat protokoly trasování serveru. "

V souboru web.config můžete použít nastavit element includeExceptionDetailInFaults na hodnotu true, takže další podrobnosti o výjimce jsou zahrnuty do poruchy, aby bylo pro vás pohodlnější zkontrolovat, co se vlastně pokazilo.

Toho můžete dosáhnout také psaním kódu. Tady je fragment kódu, který ilustruje, jak můžete tuto vlastnost nastavit na true.

typeof (ServiceDebugBehavior));

new ServiceDebugBehavior {IncludeExceptionDetailInFaults = true});

Můžete to také nastavit na true pomocí značky ServiceBehavior, jak je znázorněno níže.

[ServiceBehavior (IncludeExceptionDetailInFaults = true)]

veřejná třída DBManagerService: IDBManagerService

{

}

Když se pokusíte službu znovu využít, zobrazí se vám přesnější zpráva o výjimce.

Pomocí FaultException

Pokud však potřebujete předat uživatelsky přívětivé zprávy o výjimkách ze služby, měli byste vyvolat výjimky chyb. Výjimky poruch jsou výjimky, které jsou vyvolány službou WCF, když dojde k výjimce za běhu - takové výjimky se obvykle používají k přenosu netypových dat poruch na spotřebitele služby. Výjimky ve vašich metodách služeb můžete zpracovat stejným způsobem jako u jiných metod a poté je proměnit na výjimky poruch.

Fragment kódu níže ukazuje aktualizovanou metodu služby - metoda služby nyní vyvolá výjimku chyby.

veřejná třída DBManagerService: IDBManagerService

    {

void Save (zaměstnanec emp)

        {

Snaž se

            {

// Kód pro uložení objektu zaměstnance do databáze

            }

úlovek (výjimka mimo)

            {

vyvolá novou FaultException („Chyba při ukládání dat…“);

            }

        }

    }

Nyní byste při zpracování této služby museli ve svém kódu zpracovat výjimku z poruchy. Další informace o výjimkách chyb v WCF se můžete dozvědět z tohoto článku MSDN.

Můžete také vytvořit vlastní třídu poruch, která je označena atributem DataContract.

[DataContract]

veřejná třída CustomFault

{

[DataMember]

veřejný řetězec Zdroj;

[DataMember]

veřejný řetězec ExceptionMessage;

[DataMember]

veřejný řetězec InnerException;

[DataMember]

veřejný řetězec StackTrace;

}

Následující fragment kódu ukazuje, jak můžete pomocí třídy CustomFault vyvolat silně zadanou FaultException.

void Save (zaměstnanec emp)

{

Snaž se

{

// Kód pro uložení objektu zaměstnance do databáze

}

úlovek (výjimka mimo)

{

CustomFault cx = nový CustomFault ();

throw new FaultException (ex, new FaultReason ("This is a strong typed faed exception"));

}

}

Budete také muset zadat FaultContract atribut na vaší metodě služby, která by zvýšila FaultException. Upravená metoda Save by vypadala takto.

[ServiceContract]

veřejné rozhraní IDBManagerService

    {

[OperationContract]

[FaultContract]

void Save (Zaměstnanec emp);

    }

Pomocí returnUnknownExceptionsAsFaults

Atribut returnUnknownExceptionsAsFaults v konfiguraci chování služby můžete použít k automatickému vyvolání výjimky jako poruchy SOAP. Následující fragment kódu ukazuje, jak toho můžete dosáhnout.

returnUnknownExceptionsAsFaults = "True">

Globální zpracování výjimek

Dalším způsobem, jak zpracovat výjimky v WCF, je implementace rozhraní IErrorHandler ve vaší třídě služeb, aby bylo možné globálně zpracovat všechny výjimky a poskytnout FaultException vyhovující SOAP. Toto rozhraní obsahuje dvě metody - HandleError a ProvideFault. Zatímco první se používá k provedení určité činnosti s chybou, druhý se používá k vrácení chybové zprávy. Všimněte si, že IErrorHandler můžete také nakonfigurovat (zapnout nebo vypnout) v konfigurovatelném souboru služby.