Rukovanje iznimkama u WCF-u

Iznimke su pogreške koje se javljaju tijekom izvođenja; rukovanje iznimkama je tehnika rukovanja tim pogreškama u izvođenju. Za rukovanje iznimkama obično upotrebljavate blokove try, catch i konačno (također poznati kao blokovi iznimki) u kodu svoje aplikacije. Ako se izuzeci ne postupaju ispravno u kodu aplikacije, a izuzetak se dogodi tijekom izvođenja, izvršenje aplikacije će se prekinuti.

Rukovanje iznimkama u WCF-u nije tako izravno - ograničeni ste na slanje .Net objekata putem žice i vaša WCF usluga može klijentu slati samo serializirane podatke, tj. SOAP poruke. S iznimkama u WCF-u možete se nositi na jedan od ova tri načina:

  1. Korištenje FaultException
  2. Korištenje IErrorHandler
  3. Korištenje returnUnknownExceptionsAsFaults

U ovom postu predstavit ću raspravu o različitim načinima na koje se poruke o iznimkama mogu prenijeti iz WCF usluge potrošačima usluge.

Razmotrite ovu jednostavnu WCF uslugu.

[Uslužni ugovor]

javno sučelje IDBManagerService

    {

        [OperationContract]

        void Spremi (zaposlenik emp);

    }

Ugovor o usluzi IDBManagerService sadrži jedan operativni ugovor za zadržavanje objekta zaposlenika u bazi podataka.

javna klasa DBManagerService: IDBManagerService

    {

        void Spremi (zaposlenik emp)

        {

         probati

           {

            // Kôd za spremanje objekta zaposlenika u bazu podataka

           }

           ulov (izuzetak ex)

           {

               izbaci novu iznimku ("Došlo je do pogreške prilikom spremanja podataka ...");

           }

        }

    }

Pretpostavimo sada da postoji pogreška prilikom povezivanja s bazom podataka ili spremanja objekta zaposlenika u bazu podataka u trenutku kada pokušavate konzumirati uslugu. Tada biste dobili iznimku s ovom porukom: "System.ServiceModel.FaultException: Poslužitelj nije uspio obraditi zahtjev zbog interne pogreške. Za više informacija o pogrešci uključite IncludeExceptionDetailInFaults (bilo iz ServiceBehaviorAttribute ili iz konfiguracije ponašanje) na poslužitelju kako bi klijentu poslali informacije o iznimci ili uključili praćenje prema Microsoft .Net Framework 3.0 SDK dokumentaciji i pregledali zapisnike praćenja poslužitelja. "

Možete koristiti postaviti element includeExceptionDetailInFaults na true u datoteci web.config tako da su dodatni detalji iznimke uključeni u grešku kako bi vam bilo jednostavnije pregledati što je zapravo pošlo po zlu.

To možete postići i pisanjem koda. Ovdje je isječak koda koji ilustrira kako ovo svojstvo možete postaviti na true.

    typeof (ServiceDebugBehavior));

    novi ServiceDebugBehavior {IncludeExceptionDetailInFaults = true});

To također možete postaviti na true pomoću oznake ServiceBehavior, kao što je prikazano u nastavku.

[ServiceBehavior (IncludeExceptionDetailInFaults = true)]

javna klasa DBManagerService: IDBManagerService

{

}

Kad ponovno pokušate potrošiti uslugu, vidjet ćete precizniju poruku o iznimci.

Korištenje FaultException

Međutim, ako trebate proslijediti korisničke poruke o iznimkama iz usluge, trebali biste izbaciti iznimke grešaka. Iznimke grešaka su iznimke koje dobaci WCF usluga kada se iznimka dogodi tijekom izvođenja - takve se iznimke obično koriste za prijenos netipiziranih podataka o greškama potrošačima usluge. Možete postupati s iznimkama u svojim metodama usluge na sličan način kao i s drugim metodama, a zatim ih pretvoriti u iznimke grešaka.

Isječak koda u nastavku prikazuje ažuriranu metodu usluge - metoda usluge sada baca iznimku greške.

javna klasa DBManagerService: IDBManagerService

    {

        void Spremi (zaposlenik emp)

        {

            probati

            {

               // Kôd za spremanje objekta zaposlenika u bazu podataka

            }

            ulov (izuzetak ex)

            {

               baciti novi FaultException ("Došlo je do pogreške prilikom spremanja podataka ...");

            }

        }

    }

Sada biste trebali tretirati iznimku kvara u svom kodu kada trošite ovu uslugu. Iz ovog MSDN-ovog članka možete saznati više o iznimkama kvara u WCF-u.

Također možete stvoriti prilagođenu klasu kvara koja je označena atributom DataContract.

[DataContract]

javna klasa CustomFault

{

[Član podataka]

javni niz Izvor;

[Član podataka]

javni niz ExceptionMessage;

[Član podataka]

javni niz InnerException;

[Član podataka]

javni niz StackTrace;

}

Sljedeći isječak koda ilustrira kako možete koristiti klasu CustomFault za bacanje snažno otkucanih FaultException.

void Spremi (zaposlenik emp)

{

probati

{

  // Kôd za spremanje objekta zaposlenika u bazu podataka

}

ulov (izuzetak ex)

{

CustomFault cx = novi CustomFault ();

baciti novi FaultException (npr. novi FaultReason ("Ovo je snažno otkucana iznimka s greškom"));

}

}

Također biste trebali navesti atribut FaultContract na svojoj metodi usluge koji bi podigao FaultException. Izmijenjena metoda Spremi izgledala bi ovako.

[Uslužni ugovor]

javno sučelje IDBManagerService

    {

        [OperationContract]

        [FaultContract]

        void Spremi (zaposlenik emp);

    }

Korištenje returnUnknownExceptionsAsFaults

Atribut returnUnknownExceptionsAsFaults možete koristiti u konfiguraciji ponašanja usluge da biste automatski pokrenuli iznimku kao SOAP grešku. Sljedeći isječak koda ilustrira kako to možete postići.

                 returnUnknownExceptionsAsFaults = "True">

Rukovanje iznimkama globalno

Drugi način za rukovanje iznimkama u WCF-u je implementacija sučelja IErrorHandler na vašoj uslužnoj klasi za globalno rukovanje svim iznimkama i pružanje FaultException kompatibilnog sa SOAP-om. Ovo sučelje sadrži dvije metode - HandleError i ProvideFault. Dok se prvi koristi za izvođenje neke aktivnosti s pogreškom, drugi se koristi za vraćanje poruke o pogrešci. Imajte na umu da IErrorHandler možete konfigurirati (uključiti ili isključiti) u datoteci koju je moguće konfigurirati.