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:
- Bruke FaultException
- Bruke IErrorHandler
- 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.