Programiranje

Obravnava izjem v WCF

Izjeme so napake, ki se pojavijo med izvajanjem; ravnanje z izjemami je tehnika obdelave teh napak pri izvajanju. Za obdelavo izjem običajno uporabljate bloke try, catch in nazadnje (znani tudi kot bloki izjem) v kodi aplikacije. Če izjeme v kodi aplikacije niso pravilno obdelane in je med izvajanjem prišlo do izjeme, bi se izvajanje aplikacije končalo.

Ravnanje z izjemami v WCF ni tako enostavno - omejitev pošiljanja objektov .Net je prek žice in vaša storitev WCF lahko odjemalcu pošilja samo serializirane podatke, tj. Sporočila SOAP. Izjeme v WCF lahko obravnavate na enega od teh treh načinov:

  1. Uporaba FaultException
  2. Uporaba IErrorHandler
  3. Uporaba returnUnknownExceptionsAsFaults

V tem prispevku bom predstavil razpravo o različnih načinih prenosa sporočil o izjemah iz storitve WCF potrošnikom storitve.

Razmislite o tej preprosti storitvi WCF.

[ServiceContract]

javni vmesnik IDBManagerService

    {

[OperationContract]

void Save (Zaposleni emp);

    }

Pogodba o storitvi IDBManagerService vsebuje eno operacijsko pogodbo za ohranitev predmeta zaposlenega v bazi podatkov.

javni razred DBManagerService: IDBManagerService

    {

void Save (Zaposleni emp)

        {

poskusite

           {

// Koda za shranjevanje predmeta zaposlenega v bazo podatkov

           }

ulov (izjema ex)

           {

vrzi novo izjemo (»Napaka pri shranjevanju podatkov…«);

           }

        }

    }

Zdaj predpostavimo, da je prišlo do napake pri povezovanju z bazo podatkov ali shranjevanju predmeta zaposlenega v bazo podatkov, ko poskušate uporabiti storitev. Nato bi dobili izjemo s tem sporočilom: "System.ServiceModel.FaultException: Strežnik zaradi notranje napake ni mogel obdelati zahteve. Če želite več informacij o napaki, vklopite IncludeExceptionDetailInFaults (bodisi iz ServiceBehaviorAttribute bodisi iz konfiguracije vedenje) na strežniku, da stranki pošlje informacije o izjemi nazaj ali vklopi sledenje v skladu z dokumentacijo Microsoft .Net Framework 3.0 SDK in pregleda dnevnike sledenja strežnika. "

V datoteki web.config lahko nastavite element includeExceptionDetailInFaults na true, tako da so v napako vključene dodatne podrobnosti izjeme, da boste lažje pregledali, kaj je dejansko šlo narobe.

To lahko dosežete tudi s pisanjem kode. Tu je delček kode, ki ponazarja, kako lahko to lastnost nastavite na true.

typeof (ServiceDebugBehavior));

novo ServiceDebugBehavior {IncludeExceptionDetailInFaults = true});

To lahko nastavite tudi na true z uporabo oznake ServiceBehavior, kot je prikazano spodaj.

[ServiceBehavior (IncludeExceptionDetailInFaults = true)]

javni razred DBManagerService: IDBManagerService

{

}

Ko poskusite znova uporabiti storitev, boste videli natančnejše sporočilo o izjemi.

Uporaba FaultException

Če morate storitvi poslati uporabniku prijazna sporočila o izjemah, vrzite izjeme o napakah. Izjeme napak so izjeme, ki jih storitev WCF sproži, kadar pride do izjeme med izvajanjem - takšne izjeme se običajno uporabljajo za prenos netipiziranih podatkov o napakah potrošnikom storitve. Izjeme lahko v svojih servisnih metodah obravnavate enako kot pri drugih metodah in jih nato spremenite v izjeme napak.

Spodnji delček kode prikazuje posodobljeno metodo storitve - metoda storitve zdaj vrne izjemo napake.

javni razred DBManagerService: IDBManagerService

    {

void Save (Zaposleni emp)

        {

poskusite

            {

// Koda za shranjevanje predmeta zaposlenega v bazo podatkov

            }

ulov (izjema ex)

            {

vrzi novo FaultException (»Napaka pri shranjevanju podatkov…«);

            }

        }

    }

Zdaj bi morali pri uporabi te storitve obravnavati izjeme napak v svoji kodi. Več o izjemah napak v WCF lahko izveste v tem članku MSDN.

Ustvarite lahko tudi razred napak po meri, ki je označen z atributom DataContract.

[DataContract]

javni razred CustomFault

{

[DataMember]

javni niz Vir;

[DataMember]

javni niz ExceptionMessage;

[DataMember]

javni niz InnerException;

[DataMember]

javni niz StackTrace;

}

Naslednji delček kode prikazuje, kako lahko uporabite razred CustomFault za metanje močno vtipkanega FaultException.

void Save (Zaposleni emp)

{

poskusite

{

// Koda za shranjevanje predmeta zaposlenega v bazo podatkov

}

ulov (izjema ex)

{

CustomFault cx = novo CustomFault ();

vrzi novo FaultException (npr. nova FaultReason ("To je močno vtipkana izjema z napako"));

}

}

Prav tako bi morali v metodi storitve določiti atribut FaultContract, ki bi povzročil FaultException. Spremenjena metoda Save bi izgledala takole.

[ServiceContract]

javni vmesnik IDBManagerService

    {

[OperationContract]

[FaultContract]

void Save (Zaposleni emp);

    }

Uporaba returnUnknownExceptionsAsFaults

Atribut returnUnknownExceptionsAsFaults lahko uporabite v konfiguraciji vedenja storitve, da samodejno sprožite izjemo kot napako SOAP. Naslednji delček kode prikazuje, kako lahko to dosežete.

returnUnknownExceptionsAsFaults = "True">

Globalno ravnanje z izjemami

Drug način za obvladovanje izjem v WCF je z uporabo vmesnika IErrorHandler v vašem servisnem razredu za globalno obdelavo vseh izjem in zagotavljanje FaultException, skladnega s SOAP. Ta vmesnik vsebuje dve metodi - HandleError in ProvideFault. Medtem ko se prvi uporablja za izvajanje neke dejavnosti z napako, se drugi uporablja za vrnitev sporočila o napaki. Upoštevajte, da lahko tudi IErrorHandler konfigurirate (vklopite ali izklopite) v datoteki, ki jo je mogoče konfigurirati.

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