Undantagshantering i WCF

Undantag är fel som uppstår vid körning. undantagshantering är tekniken för att hantera dessa runtime-fel. Du använder vanligtvis försök, fånga och slutligen block (även känd som undantagsblock) i programmets kod för att hantera undantag. Om undantag inte hanteras ordentligt i programmets kod och ett undantag har inträffat vid körning, kommer körningen av programmet att avslutas.

Undantagshantering i WCF är inte så rakt fram - du är begränsad till att skicka .Net-objekt över kabeln och din WCF-tjänst kan bara skicka seriell data, dvs. SOAP-meddelanden till klienten. Du kan hantera undantag i WCF på ett av dessa tre sätt:

  1. Använda FaultException
  2. Använda IErrorHandler
  3. Använda returnUnknownExceptionsAsFaults

I det här inlägget kommer jag att presentera en diskussion om olika sätt på vilka undantagsmeddelanden kan överföras från WCF-tjänsten till konsumenterna av tjänsten.

Tänk på den här enkla WCF-tjänsten.

[Tjänstekontrakt]

offentligt gränssnitt IDBManagerService

    {

        [OperationContract]

        ogiltig spara (anställd);

    }

Serviceavtalet IDBManagerService innehåller ett operationskontrakt för att bestå ett anställds objekt till databasen.

offentlig klass DBManagerService: IDBManagerService

    {

        ogiltig spara (anställd emp)

        {

         Prova

           {

            // Kod för att lagra ett anställds objekt i databasen

           }

           fångst (undantag ex)

           {

               kasta nytt undantag ("Fel inträffade när data sparades ...");

           }

        }

    }

Antag nu att det finns ett fel vid anslutning till databasen eller lagring av anställdsobjektet i databasen när du försöker konsumera tjänsten. Du får då ett undantag med detta meddelande: "System.ServiceModel.FaultException: Servern kunde inte behandla begäran på grund av ett internt fel. För mer information om felet, aktivera antingen IncludeExceptionDetailInFaults (antingen från ServiceBehaviorAttribute eller från konfigurationen beteende) på servern för att skicka tillbaka undantagsinformationen till klienten eller aktivera spårning enligt Microsoft .Net Framework 3.0 SDK-dokumentationen och inspektera serverns spårningsloggar. "

Du kan ställa in includeExceptionDetailInFaults-elementet till true i filen web.config så att ytterligare detaljer i undantaget ingår i felet för att göra det bekvämare för dig att inspektera vad som faktiskt gick fel.

Du kan också uppnå detta genom att skriva kod. Här är ett kodavsnitt som illustrerar hur du kan ställa in den här egenskapen till true.

    typeof (ServiceDebugBehavior));

    ny ServiceDebugBehavior {IncludeExceptionDetailInFaults = true});

Du kan också ställa in detta till sant med ServiceBehavior-taggen som visas nedan.

[ServiceBehavior (IncludeExceptionDetailInFaults = true)]

offentlig klass DBManagerService: IDBManagerService

{

}

När du försöker konsumera tjänsten igen ser du ett mer exakt undantagsmeddelande.

Använda FaultException

Men om du behöver skicka användarvänliga undantagsmeddelanden från tjänsten, bör du kasta felundantag. Felundantag är undantag som kastas av en WCF-tjänst när ett undantag inträffar vid körning - sådana undantag används vanligtvis för att överföra otypade feldata till tjänstekonsumenterna. Du kan hantera undantag i dina servicemetoder på samma sätt som du gör med andra metoder och sedan göra dem till felundantag.

Kodavsnittet nedan visar den uppdaterade servicemetoden - servicemetoden ger nu felundantag.

offentlig klass DBManagerService: IDBManagerService

    {

        ogiltig spara (anställd emp)

        {

            Prova

            {

               // Kod för att lagra ett anställds objekt i databasen

            }

            fångst (undantag ex)

            {

               kasta ny FaultException ("Fel inträffade när data sparades ...");

            }

        }

    }

Du måste nu hantera felundantag i din kod när du konsumerar den här tjänsten. Du kan lära dig mer om felundantag i WCF från denna MSDN-artikel.

Du kan också skapa en anpassad felklass som är markerad med attributet DataContract.

[DataContract]

offentlig klass CustomFault

{

[DataMember]

public string Källa;

[DataMember]

public string ExceptionMessage;

[DataMember]

public string InnerException;

[DataMember]

offentlig sträng StackTrace;

}

Följande kodavsnitt illustrerar hur du kan använda CustomFault-klassen för att kasta FaultException med starkt typ.

ogiltig spara (anställd emp)

{

Prova

{

  // Kod för att spara medarbetarobjektet i databasen

}

fångst (undantag ex)

{

CustomFault cx = ny CustomFault ();

kasta nytt FaultException (ex, nytt FaultReason ("Detta är ett starkt skrivet felaktigt undantag"));

}

}

Du måste också ange attributet FaultContract på din servicemetod som skulle höja FaultException. Den modifierade Save-metoden skulle se ut så här.

[Tjänstekontrakt]

offentligt gränssnitt IDBManagerService

    {

        [OperationContract]

        [Felkontrakt]

        ogiltig spara (anställd);

    }

Använda returnUnknownExceptionsAsFaults

Du kan använda attributet returnUnknownExceptionsAsFaults i konfigurationen av tjänstbeteende för att automatiskt ta fram ett undantag som ett SOAP-fel. Följande kodavsnitt illustrerar hur du kan uppnå detta.

                 returnUnknownExceptionsAsFaults = "True">

Hantering av undantag globalt

Ett annat sätt att hantera undantag i WCF är genom att implementera IErrorHandler-gränssnittet i din serviceklass för att hantera alla undantag globalt och tillhandahålla ett SOAP-kompatibelt FaultException. Detta gränssnitt innehåller två metoder - HandleError och ProvideFault. Medan den förstnämnda används för att utföra viss aktivitet med felet, används den senare för att returnera ett felmeddelande. Observera att du också kan konfigurera IErrorHandler (aktivera eller inaktivera den) i din tjänstkonfigurerbara fil.