Programmering

Undtagelseshåndtering i WCF

Undtagelser er fejl, der opstår ved kørsel; undtagelseshåndtering er teknikken til håndtering af disse runtime-fejl. Du bruger typisk prøve, fange og til sidst blokke (også kendt som undtagelsesblokke) i din applikations kode til at håndtere undtagelser. Hvis undtagelser ikke håndteres korrekt i applikationens kode, og der er opstået en undtagelse under kørsel, afsluttes eksekveringen af ​​applikationen.

Undtagelsesbehandling i WCF er ikke så ligetil - du er begrænset til at sende .Net-objekter over ledningen, og din WCF-tjeneste kan kun sende serielle data, dvs. SOAP-meddelelser til klienten. Du kan håndtere undtagelser i WCF på en af ​​disse tre måder:

  1. Brug af FaultException
  2. Brug af IErrorHandler
  3. Brug af returnUnknownExceptionsAsFaults

I dette indlæg vil jeg præsentere en diskussion om de forskellige måder, hvorpå undtagelsesmeddelelser kan overføres fra WCF-tjenesten til forbrugerne af tjenesten.

Overvej denne enkle WCF-tjeneste.

[Service kontrakt]

offentlig grænseflade IDBManagerService

    {

[OperationContract]

ugyldig Save (medarbejder-emp);

    }

IDBManagerService-servicekontrakten indeholder en operationskontrakt til at fastholde et medarbejderobjekt over for databasen.

offentlig klasse DBManagerService: IDBManagerService

    {

ugyldig Save (medarbejder-emp)

        {

prøve

           {

// Kode til lagring af et medarbejderobjekt til databasen

           }

fangst (undtagelse ex)

           {

smid ny undtagelse ("Der opstod en fejl under lagring af data ...");

           }

        }

    }

Antag nu, at der er en fejl ved oprettelse af forbindelse til databasen eller lagring af medarbejderobjektet til databasen på det tidspunkt, hvor du prøver at forbruge tjenesten. Derefter får du en undtagelse med denne meddelelse: "System.ServiceModel.FaultException: Serveren kunne ikke behandle anmodningen på grund af en intern fejl. For at få flere oplysninger om fejlen skal du enten aktivere IncludeExceptionDetailInFaults (enten fra ServiceBehaviorAttribute eller fra konfigurationen adfærd) på serveren for at sende undtagelsesoplysningerne tilbage til klienten eller slå sporing til i henhold til Microsoft .Net Framework 3.0 SDK-dokumentationen og inspicere serverens sporingslogfiler. "

Du kan bruge til at indstille includeExceptionDetailInFaults-elementet til sandt i web.config-filen, så de yderligere detaljer om undtagelsen er inkluderet i fejlen for at gøre det mere bekvemt for dig at inspicere, hvad der faktisk gik galt.

Du kan også opnå dette ved at skrive kode. Her er et kodestykke, der illustrerer, hvordan du kan indstille denne egenskab til sand.

typeof (ServiceDebugBehavior));

ny ServiceDebugBehavior {IncludeExceptionDetailInFaults = true});

Du kan også indstille dette til sandt ved hjælp af ServiceBehavior-tagget som vist nedenfor.

[ServiceBehavior (IncludeExceptionDetailInFaults = true)]

offentlig klasse DBManagerService: IDBManagerService

{

}

Når du prøver at forbruge tjenesten igen, vil du se en mere præcis undtagelsesmeddelelse.

Brug af FaultException

Men hvis du har brug for at sende brugervenlige undtagelsesmeddelelser fra tjenesten, skal du kaste fejlundtagelser. Fejlundtagelser er undtagelser, der kastes af en WCF-tjeneste, når en undtagelse opstår ved kørsel - sådanne undtagelser bruges typisk til at overføre utypede fejldata til serviceforbrugerne. Du kan håndtere undtagelser i dine servicemetoder på samme måde som du gør med andre metoder og derefter gøre dem til fejlundtagelser.

Kodestykket nedenfor viser den opdaterede servicemetode - servicemetoden kaster nu fejlundtagelse.

offentlig klasse DBManagerService: IDBManagerService

    {

ugyldig Save (medarbejder-emp)

        {

prøve

            {

// Kode til lagring af et medarbejderobjekt til databasen

            }

fangst (undtagelse ex)

            {

smid ny FaultException ("Der opstod en fejl under lagring af data ...");

            }

        }

    }

Du skal nu håndtere fejlundtagelse i din kode, når du bruger denne service. Du kan lære mere om fejlundtagelser i WCF fra denne MSDN-artikel.

Du kan også oprette en brugerdefineret fejlklasse, der er markeret med attributten DataContract.

[Datakontrakt]

offentlig klasse CustomFault

{

[DataMember]

offentlig streng Kilde;

[DataMember]

offentlig streng ExceptionMessage;

[DataMember]

offentlig streng InnerException;

[DataMember]

offentlig streng StackTrace;

}

Følgende kodestykke illustrerer, hvordan du kan bruge klassen CustomFault til at kaste FaultException med stærkt indtastning.

ugyldig Save (medarbejder-emp)

{

prøve

{

// Kode for at gemme medarbejderobjektet i databasen

}

fangst (undtagelse ex)

{

CustomFault cx = ny CustomFault ();

smid ny FaultException (f.eks. ny FaultReason ("Dette er en stærkt skrevet fejlbehæftet undtagelse"));

}

}

Du skal også angive attributten FaultContract på din servicemetode, der hæver FaultException. Den modificerede Save-metode vil se sådan ud.

[Service kontrakt]

offentlig grænseflade IDBManagerService

    {

[OperationContract]

[Fejlkontrakt]

ugyldig Save (medarbejder-emp);

    }

Brug af returnUnknownExceptionsAsFaults

Du kan bruge attributten returnUnknownExceptionsAsFaults i konfigurationen af ​​tjenesteadfærd til automatisk at hæve en undtagelse som en SOAP-fejl. Følgende kodestykke illustrerer, hvordan du kan opnå dette.

returnUnknownExceptionsAsFaults = "True">

Håndtering af undtagelser globalt

En anden måde at håndtere undtagelser i WCF er ved at implementere IErrorHandler-grænsefladen på din serviceklasse til at håndtere alle undtagelser globalt og give en SOAP-kompatibel FaultException. Denne grænseflade indeholder to metoder - HandleError og ProvideFault. Mens førstnævnte bruges til at udføre en aktivitet med fejlen, bruges sidstnævnte til at returnere en fejlmeddelelse. Bemærk, at du også kan konfigurere IErrorHandler (slå den til eller fra) i din konfigurerbare fil.