Programmering

Unntakshåndtering i WCF

Unntak er feil som oppstår ved kjøretid; unntakshåndtering er teknikken for å håndtere disse kjøretidsfeilene. Du bruker vanligvis prøve, fange og til slutt blokker (også kjent som unntaksblokker) i programmets kode for å håndtere unntak. Hvis unntak ikke håndteres riktig i programmets kode, og et unntak har skjedd under kjøretid, vil kjøringen av applikasjonen avsluttes.

Unntakshåndtering i WCF er ikke så rett frem - du er begrenset til å sende .Net-objekter over ledningen, og WCF-tjenesten din kan bare sende serielle data, dvs. SOAP-meldinger til klienten. Du kan håndtere unntak i WCF på en av disse tre måtene:

  1. Bruke FaultException
  2. Bruke IErrorHandler
  3. Bruke returnUnknownExceptionsAsFaults

I dette innlegget vil jeg presentere en diskusjon om de forskjellige måtene unntaksmeldinger kan overføres fra WCF-tjenesten til forbrukerne av tjenesten.

Vurder denne enkle WCF-tjenesten.

[Servicekontrakt]

offentlig grensesnitt IDBManagerService

    {

[OperationContract]

ugyldig Save (ansattes emp)

    }

IDBManagerService-tjenestekontrakten inneholder en operasjonskontrakt for å vedvare et ansattes objekt mot databasen.

offentlig klasse DBManagerService: IDBManagerService

    {

ugyldig lagre (ansattes emp)

        {

prøve

           {

// Kode for å lagre et ansattes objekt til databasen

           }

fangst (Unntak eks)

           {

kaste nytt unntak ("Det oppstod en feil under lagring av data ...");

           }

        }

    }

Anta nå at det er en feil ved tilkobling til databasen eller lagring av ansattes objekt i databasen på det tidspunktet du prøver å konsumere tjenesten. Du vil da få et unntak med denne meldingen: "System.ServiceModel.FaultException: Serveren klarte ikke å behandle forespørselen på grunn av en intern feil. For mer informasjon om feilen, slå enten på IncludeExceptionDetailInFaults (enten fra ServiceBehaviorAttribute eller fra konfigurasjonen oppførsel) på serveren for å sende unntaksinformasjonen tilbake til klienten, eller slå på sporing i henhold til Microsoft .Net Framework 3.0 SDK-dokumentasjonen og inspiser serverens sporingslogger. "

Du kan bruke til å sette includeExceptionDetailInFaults-elementet til true i web.config-filen slik at tilleggsdetaljene for unntaket er inkludert i feilen for å gjøre det mer praktisk for deg å inspisere hva som faktisk gikk galt.

Du kan også oppnå dette ved å skrive kode. Her er et kodebit som illustrerer hvordan du kan sette denne egenskapen til sant.

typeof (ServiceDebugBehavior));

ny ServiceDebugBehavior {IncludeExceptionDetailInFaults = true});

Du kan også sette dette til sant ved å bruke ServiceBehavior-koden som vist nedenfor.

[ServiceBehavior (IncludeExceptionDetailInFaults = true)]

offentlig klasse DBManagerService: IDBManagerService

{

}

Når du prøver å konsumere tjenesten igjen, vil du se en mer presis unntaksmelding.

Bruke FaultException

Imidlertid, hvis du trenger å sende brukervennlige unntaksmeldinger fra tjenesten, bør du kaste feil unntak. Feil unntak er unntak som kastes av en WCF-tjeneste når et unntak oppstår ved kjøretid - slike unntak brukes vanligvis til å overføre utypede feildata til tjenesteforbrukerne. Du kan håndtere unntak i tjenestemetodene dine på samme måte som du gjør med andre metoder, og deretter gjøre dem til feil unntak.

Kodebiten nedenfor viser den oppdaterte tjenestemetoden - tjenestemetoden kaster nå feil unntak.

offentlig klasse DBManagerService: IDBManagerService

    {

ugyldig lagre (ansattes emp)

        {

prøve

            {

// Kode for å lagre et ansattes objekt til databasen

            }

fangst (Unntak eks)

            {

kaste ny FaultException ("Det oppstod en feil under lagring av data ...");

            }

        }

    }

Du må nå håndtere feil unntak i koden din når du bruker denne tjenesten. Du kan lære mer om feil unntak i WCF fra denne MSDN artikkelen.

Du kan også opprette en tilpasset feilklasse som er merket med DataContract-attributtet.

[DataContract]

offentlig klasse CustomFault

{

[DataMember]

offentlig streng Kilde;

[DataMember]

offentlig streng ExceptionMessage;

[DataMember]

offentlig streng InnerException;

[DataMember]

offentlig streng StackTrace;

}

Følgende kodebit illustrerer hvordan du kan bruke CustomFault-klassen til å kaste FaultException med sterk inntasting.

ugyldig lagre (ansattes emp)

{

prøve

{

// Kode for å lagre medarbeiderobjektet i databasen

}

fangst (Unntak eks)

{

CustomFault cx = ny CustomFault ();

kaste nytt FaultException (ex, new FaultReason ("Dette er et sterkt skrevet feilaktig unntak"));

}

}

Du må også spesifisere FaultContract-attributtet på tjenestemetoden din som vil øke FaultException. Den modifiserte Save-metoden vil se slik ut.

[Servicekontrakt]

offentlig grensesnitt IDBManagerService

    {

[OperationContract]

[Feilkontrakt]

ugyldig Save (ansattes emp)

    }

Bruke returnUnknownExceptionsAsFaults

Du kan bruke attributtet returnUnknownExceptionsAsFaults i konfigurasjonen av tjenesteadferd for å automatisk opprette et unntak som en SOAP-feil. Følgende kodebit illustrerer hvordan du kan oppnå dette.

returnUnknownExceptionsAsFaults = "True">

Håndtering av unntak globalt

En annen måte å håndtere unntak i WCF er ved å implementere IErrorHandler-grensesnittet på tjenesteklassen din for å håndtere alle unntak globalt og gi et SOAP-kompatibelt FaultException. Dette grensesnittet inneholder to metoder - HandleError og ProvideFault. Mens førstnevnte brukes til å utføre noe aktivitet med feilen, brukes sistnevnte til å returnere en feilmelding. Merk at du også kan konfigurere IErrorHandler (slå den på eller av) i den tjenestekonfigurerbare filen.

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