Programovanie

Spracovanie výnimiek v WCF

Výnimkou sú chyby, ktoré sa vyskytujú za behu programu; spracovanie výnimiek je technika spracovania týchto runtime chýb. Na spracovanie výnimiek by ste zvyčajne použili bloky try, catch a nakoniec (známe tiež ako bloky výnimiek) v kóde vašej aplikácie. Ak výnimky nie sú v kóde aplikácie spracované správne a za behu aplikácie došlo k výnimke, vykonanie aplikácie by sa skončilo.

Spracovanie výnimiek v WCF nie je také priame - ste obmedzený na odosielanie objektov .Net cez drôt a vaša služba WCF môže klientovi odosielať iba serializované údaje, t. J. Správy SOAP. Výnimky vo WCF môžete spracovať jedným z týchto troch spôsobov:

  1. Pomocou FaultException
  2. Pomocou IErrorHandler
  3. Pomocou returnUnknownExceptionsAsFaults

V tomto príspevku predstavím diskusiu o rôznych spôsoboch, ako je možné prenášať správy o výnimkách zo služby WCF na spotrebiteľov tejto služby.

Zvážte túto jednoduchú službu WCF.

[Servisná zmluva]

verejné rozhranie IDBManagerService

    {

[OperationContract]

void Save (Zamestnanec emp);

    }

Zmluva o poskytovaní služieb IDBManagerService obsahuje jednu prevádzkovú zmluvu na uchovanie objektu zamestnanca v databáze.

verejná trieda DBManagerService: IDBManagerService

    {

void Save (Zamestnanec emp)

        {

skús

           {

// Kód na uloženie objektu zamestnanca do databázy

           }

úlovok (výnimka okrem)

           {

vyvolať novú výnimku („Chyba pri ukladaní údajov ...“);

           }

        }

    }

Teraz predpokladajme, že v čase, keď sa pokúšate využiť službu, došlo k chybe pri pripájaní k databáze alebo ukladaní objektu zamestnanca do databázy. S touto správou by ste potom dostali výnimku: „System.ServiceModel.FaultException: Server nemohol spracovať požiadavku kvôli internej chybe. Ďalšie informácie o chybe získate zapnutím IncludeExceptionDetailInFaults (buď z ServiceBehaviorAttribute alebo z konfigurácie správanie) na serveri, aby ste mohli odoslať informácie o výnimke späť klientovi, alebo zapnúť sledovanie podľa dokumentácie Microsoft .Net Framework 3.0 SDK a skontrolovať protokoly sledovania servera. "

V súbore web.config môžete použiť prvok includeExceptionDetailInFaults na hodnotu true, aby sa do chyby dostali ďalšie podrobnosti o výnimke, aby bolo pre vás pohodlnejšie skontrolovať, čo sa vlastne pokazilo.

Môžete to dosiahnuť aj napísaním kódu. Tu je útržok kódu, ktorý ilustruje, ako môžete nastaviť túto vlastnosť na hodnotu true.

typeof (ServiceDebugBehavior));

new ServiceDebugBehavior {IncludeExceptionDetailInFaults = true});

Môžete to tiež nastaviť na hodnotu true pomocou značky ServiceBehavior, ako je uvedené nižšie.

[ServiceBehavior (IncludeExceptionDetailInFaults = true)]

verejná trieda DBManagerService: IDBManagerService

{

}

Pri ďalšom pokuse o využitie služby by sa vám zobrazila presnejšia správa o výnimke.

Pomocou FaultException

Ak však potrebujete zo služby odovzdať užívateľsky prívetivé správy o výnimkách, mali by ste vyhodiť výnimky z poruchy. Výnimky chýb sú výnimky, ktoré vyvolá služba WCF, keď dôjde k výnimke za behu programu - takéto výnimky sa zvyčajne používajú na prenos netypových údajov o poruchách zákazníkom služby. Výnimky vo vašich servisných metódach môžete spracovať rovnakým spôsobom ako v prípade iných metód, ktoré z nich potom urobia výnimky týkajúce sa porúch.

Fragment kódu nižšie zobrazuje aktualizovanú metódu služby - metóda služby teraz vyvolá výnimku chyby.

verejná trieda DBManagerService: IDBManagerService

    {

void Save (Zamestnanec emp)

        {

skús

            {

// Kód na uloženie objektu zamestnanca do databázy

            }

úlovok (výnimka okrem)

            {

vyvolať novú FaultException („Chyba pri ukladaní dát ...“);

            }

        }

    }

Pri využívaní tejto služby by ste teraz museli vo svojom kóde spracovať výnimku z poruchy. Viac informácií o výnimkách chýb v WCF sa dozviete z tohto článku na webe MSDN.

Môžete tiež vytvoriť vlastnú triedu porúch, ktorá je označená atribútom DataContract.

[DataContract]

verejná trieda CustomFault

{

[DataMember]

verejný reťazec Zdroj;

[DataMember]

verejný reťazec ExceptionMessage;

[DataMember]

verejný reťazec InnerException;

[DataMember]

verejný reťazec StackTrace;

}

Nasledujúci úryvok kódu ilustruje, ako môžete použiť triedu CustomFault na vyvolanie výraznej chyby FaultException.

void Save (Zamestnanec emp)

{

skús

{

// Kód na uloženie objektu zamestnanca do databázy

}

úlovok (výnimka okrem)

{

CustomFault cx = nový CustomFault ();

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

}

}

Tiež by ste vo svojej metóde služby museli určiť atribút FaultContract, ktorý by zvýšil FaultException. Upravená metóda uloženia by vyzerala takto.

[Servisná zmluva]

verejné rozhranie IDBManagerService

    {

[OperationContract]

[FaultContract]

void Save (Zamestnanec emp);

    }

Pomocou returnUnknownExceptionsAsFaults

Atribút returnUnknownExceptionsAsFaults v konfigurácii správania služby môžete použiť na automatické zvýšenie výnimky ako chyby SOAP. Nasledujúci úryvok kódu ilustruje, ako to môžete dosiahnuť.

returnUnknownExceptionsAsFaults = "True">

Globálne riešenie výnimiek

Ďalším spôsobom, ako zvládnuť výnimky v WCF, je implementácia rozhrania IErrorHandler vo vašej triede služieb, aby ste globálne zvládli všetky výnimky a poskytli FaultException vyhovujúcu protokolu SOAP. Toto rozhranie obsahuje dve metódy - HandleError a ProvideFault. Zatiaľ čo prvé sa používa na vykonávanie určitých činností s chybou, druhé sa používa na vrátenie chybového hlásenia. Upozorňujeme, že IErrorHandler môžete tiež nakonfigurovať (zapnúť alebo vypnúť) v konfigurovateľnom súbore služby.

$config[zx-auto] not found$config[zx-overlay] not found