Programmēšana

Izņēmumu apstrāde WCF

Izņēmumi ir kļūdas, kas rodas izpildlaikā; izņēmumu apstrāde ir šo izpildlaika kļūdu apstrādes paņēmiens. Lai apstrādātu izņēmumus, parasti lietojumprogrammas kodā izmantojat try, catch un, visbeidzot, bloķēšanas (sauktas arī par izņēmuma blokiem). Ja izņēmumi netiek pareizi apstrādāti lietojumprogrammas kodā un izpildes laikā ir noticis izņēmums, lietojumprogrammas izpilde tiks pārtraukta.

Izņēmumu apstrāde WCF nav tik vienkārša - jums ir jānosūta .Net objekti pa vadu, un jūsu WCF pakalpojums klientam var nosūtīt tikai sērijveida datus, t.i., SOAP ziņojumus. WCF varat rīkoties ar izņēmumiem vienā no šiem trim veidiem:

  1. Izmantojot FaultException
  2. Izmantojot IErrorHandler
  3. Izmantojot returnUnknownExceptionsAsFaults

Šajā amatā es iepazīstināšu ar diskusiju par dažādiem veidiem, kā izņēmuma ziņojumus no WCF pakalpojuma var nosūtīt pakalpojuma patērētājiem.

Apsveriet šo vienkāršo WCF pakalpojumu.

[ServiceContract]

publiskā saskarne IDBManagerService

    {

[OperationContract]

void Saglabāt (Employee emp);

    }

Pakalpojuma IDBManagerService līgumā ir viens darbības līgums, lai saglabātu darbinieka objektu datu bāzē.

publiskā klase DBManagerService: IDBManagerService

    {

void Saglabāt (darbinieka emp)

        {

mēģiniet

           {

// Kods darbinieka objekta glabāšanai datu bāzē

           }

nozveja (izņēmums ex)

           {

mest jaunu izņēmumu (“Saglabājot datus radās kļūda ...”);

           }

        }

    }

Tagad pieņemsim, ka, mēģinot patērēt pakalpojumu, ir kļūda, izveidojot savienojumu ar datu bāzi vai saglabājot darbinieka objektu datu bāzē. Pēc tam jūs saņemsit izņēmumu ar šo ziņojumu: "System.ServiceModel.FaultException: serveris nevarēja apstrādāt pieprasījumu iekšējas kļūdas dēļ. Lai iegūtu papildinformāciju par kļūdu, ieslēdziet IncludeExceptionDetailInFaults (vai nu no ServiceBehaviorAttribute, vai no konfigurācijas uzvedība) serverī, lai nosūtītu informāciju par izņēmumiem atpakaļ klientam vai ieslēgtu izsekošanu saskaņā ar Microsoft .Net Framework 3.0 SDK dokumentāciju un pārbaudītu servera izsekošanas žurnālus. "

Failā web.config varat iestatīt elementa includeExceptionDetailInFaults vērtību true, lai kļūmē tiktu iekļauta papildu informācija par izņēmumu, lai jums būtu ērtāk pārbaudīt, kas faktiski ir noticis nepareizi.

To var sasniegt arī, uzrakstot kodu. Šeit ir koda fragments, kas ilustrē, kā jūs varat iestatīt šo rekvizītu kā patiesu.

typeof (ServiceDebugBehavior));

jauns ServiceDebugBehavior {IncludeExceptionDetailInFaults = true});

Varat arī iestatīt to uz true, izmantojot tagu ServiceBehavior, kā parādīts zemāk.

[ServiceBehavior (IncludeExceptionDetailInFaults = true)]

publiskā klase DBManagerService: IDBManagerService

{

}

Mēģinot vēlreiz patērēt pakalpojumu, tiks parādīts precīzāks izņēmuma ziņojums.

Izmantojot FaultException

Tomēr, ja jums ir jānodod lietotājam draudzīgi izņēmuma ziņojumi no pakalpojuma, jums vajadzētu mest kļūdu izņēmumus. Kļūdu izņēmumi ir izņēmumi, kurus izmet WCF pakalpojums, kad izpildes laikā rodas izņēmums - šādus izņēmumus parasti izmanto, lai pārsūtītu netipētos kļūdu datus pakalpojuma patērētājiem. Apkalpošanas metožu izņēmumus var apstrādāt tāpat kā ar citām metodēm, un pēc tam tos pārveidot par kļūdu izņēmumiem.

Tālāk redzamajā koda fragmentā ir parādīta atjauninātā pakalpojuma metode - pakalpojuma metode tagad rada kļūdas izņēmumu.

publiskā klase DBManagerService: IDBManagerService

    {

void Saglabāt (darbinieka emp)

        {

mēģiniet

            {

// Kods darbinieka objekta glabāšanai datu bāzē

            }

nozveja (izņēmums ex)

            {

mest jaunu FaultException (“Saglabājot datus radās kļūda ...”);

            }

        }

    }

Tagad, lietojot šo pakalpojumu, jums būs jārīkojas ar kļūdu izņēmumu jūsu kodā. Šajā MSDN rakstā varat uzzināt vairāk par kļūdu izņēmumiem WCF.

Varat arī izveidot pielāgotu kļūdu klasi, kas ir atzīmēta ar atribūtu DataContract.

[DataContract]

publiskā klase CustomFault

{

[DataMember]

public string Avots;

[DataMember]

publiska virkne ExceptionMessage;

[DataMember]

publiska virkne InnerException;

[DataMember]

publiskā virkne StackTrace;

}

Šis koda fragments parāda, kā jūs varat izmantot CustomFault klasi, lai izmestu stingri ierakstītu FaultException.

void Saglabāt (darbinieka emp)

{

mēģiniet

{

// Kods, lai saglabātu darbinieka objektu datu bāzē

}

nozveja (izņēmums ex)

{

CustomFault cx = new CustomFault ();

mest jaunu FaultException (ex, new FaultReason ("Šis ir ļoti tipizēts kļūdains izņēmums"));

}

}

Pakalpojuma metodē jums arī jānorāda atribūts FaultContract, kas paaugstinātu FaultException. Modificētā Saglabāšanas metode izskatīsies šādi.

[ServiceContract]

publiskā saskarne IDBManagerService

    {

[OperationContract]

[FaultContract]

void Saglabāt (Employee emp);

    }

Izmantojot returnUnknownExceptionsAsFaults

Pakalpojuma uzvedības konfigurācijā atribūtu returnUnknownExceptionsAsFaults var izmantot, lai automātiski izņēmumu izsauktu kā SOAP kļūdu. Šis koda fragments parāda, kā jūs to varat sasniegt.

returnUnknownExceptionsAsFaults = "True">

Izņēmumu apstrāde visā pasaulē

Vēl viens veids, kā rīkoties ar izņēmumiem WCF, ir IErrorHandler saskarnes ieviešana jūsu pakalpojumu klasē, lai visus izņēmumus apstrādātu globāli un nodrošinātu SOAP atbilstošu FaultException. Šajā saskarnē ir divas metodes - HandleError un ProvideFault. Kamēr pirmais tiek izmantots, lai veiktu kādu darbību ar kļūdu, otrais tiek izmantots, lai atgrieztu kļūdas ziņojumu. Ņemiet vērā, ka pakalpojumu IErrorHandler varat arī konfigurēt (ieslēgt vai izslēgt) pakalpojumā konfigurējamā failā.