Gestion des exceptions dans WCF

Les exceptions sont des erreurs qui se produisent lors de l'exécution; la gestion des exceptions est la technique de gestion de ces erreurs d'exécution. Vous utiliserez généralement des blocs try, catch et finally (également appelés blocs d'exception) dans le code de votre application pour gérer les exceptions. Si les exceptions ne sont pas gérées correctement dans le code de l'application et qu'une exception s'est produite lors de l'exécution, l'exécution de l'application prendrait fin.

La gestion des exceptions dans WCF n'est pas si simple - vous êtes contraint d'envoyer des objets .Net via le réseau et votre service WCF ne peut envoyer que des données sérialisées, c'est-à-dire des messages SOAP au client. Vous pouvez gérer les exceptions dans WCF de l'une de ces trois manières:

  1. Utilisation de FaultException
  2. Utilisation de IErrorHandler
  3. Utilisation de returnUnknownExceptionsAsFaults

Dans cet article, je présenterai une discussion sur les différentes façons dont les messages d'exception peuvent être transmis du service WCF aux consommateurs du service.

Considérez ce service WCF simple.

[Contrat de service]

interface publique IDBManagerService

    {

        [OperationContract]

        void Save (Employé emp);

    }

Le contrat de service IDBManagerService contient un contrat d'opération pour conserver un objet employé dans la base de données.

classe publique DBManagerService: IDBManagerService

    {

        void Save (Employé emp)

        {

         essayer

           {

            // Code pour stocker un objet employé dans la base de données

           }

           catch (Exception ex)

           {

               lancer une nouvelle exception («Une erreur s'est produite lors de l'enregistrement des données…»);

           }

        }

    }

Supposons maintenant qu'il y ait une erreur de connexion à la base de données ou de stockage de l'objet employé dans la base de données au moment où vous essayez d'utiliser le service. Vous obtiendrez alors une exception avec ce message: "System.ServiceModel.FaultException: le serveur n'a pas pu traiter la demande en raison d'une erreur interne. Pour plus d'informations sur l'erreur, activez IncludeExceptionDetailInFaults (à partir de ServiceBehaviorAttribute ou à partir de la configuration comportement) sur le serveur afin de renvoyer les informations d'exception au client, ou activer le traçage selon la documentation du SDK Microsoft .Net Framework 3.0 et inspecter les journaux de suivi du serveur.

Vous pouvez utiliser définir l'élément includeExceptionDetailInFaults sur true dans le fichier web.config afin que les détails supplémentaires de l'exception soient inclus dans l'erreur pour qu'il soit plus pratique pour vous d'inspecter ce qui s'est réellement passé.

Vous pouvez également y parvenir en écrivant du code. Voici un extrait de code qui illustre comment vous pouvez définir cette propriété sur true.

    typeof (ServiceDebugBehavior));

    nouveau ServiceDebugBehavior {IncludeExceptionDetailInFaults = true});

Vous pouvez également définir cela sur true à l'aide de la balise ServiceBehavior comme indiqué ci-dessous.

[ServiceBehavior (IncludeExceptionDetailInFaults = true)]

classe publique DBManagerService: IDBManagerService

{

}

Lorsque vous essayez à nouveau de consommer le service, vous verrez un message d'exception plus précis.

Utilisation de FaultException

Toutefois, si vous devez transmettre des messages d'exception conviviaux à partir du service, vous devez lever des exceptions d'erreur. Les exceptions d'erreur sont des exceptions qui sont levées par un service WCF lorsqu'une exception se produit au moment de l'exécution - ces exceptions sont généralement utilisées pour transmettre des données d'erreur non typées aux consommateurs de service. Vous pouvez gérer les exceptions dans vos méthodes de service de la même manière que vous le faites avec d'autres méthodes, puis les transformer en exceptions d'erreur.

L'extrait de code ci-dessous montre la méthode de service mise à jour - la méthode de service lève désormais une exception d'erreur.

classe publique DBManagerService: IDBManagerService

    {

        void Save (Employé emp)

        {

            essayer

            {

               // Code pour stocker un objet employé dans la base de données

            }

            catch (Exception ex)

            {

               lancer une nouvelle FaultException («Une erreur s'est produite lors de l'enregistrement des données…»);

            }

        }

    }

Vous devez maintenant gérer l'exception d'erreur dans votre code lorsque vous utilisez ce service. Vous pouvez en savoir plus sur les exceptions d'erreur dans WCF à partir de cet article MSDN.

Vous pouvez également créer une classe d'erreur personnalisée marquée avec l'attribut DataContract.

[DataContract]

classe publique CustomFault

{

[DataMember]

chaîne publique Source;

[DataMember]

chaîne publique ExceptionMessage;

[DataMember]

public string InnerException;

[DataMember]

chaîne publique StackTrace;

}

L'extrait de code suivant illustre comment vous pouvez utiliser la classe CustomFault pour lever une exception FaultException fortement typée.

void Save (Employé emp)

{

essayer

{

  // Code pour enregistrer l'objet employé dans la base de données

}

catch (Exception ex)

{

CustomFault cx = nouveau CustomFault ();

throw new FaultException (ex, new FaultReason ("Ceci est une exception à faute fortement typée"));

}

}

Vous devrez également spécifier l'attribut FaultContract sur votre méthode de service qui déclencherait FaultException. La méthode Save modifiée ressemblerait à ceci.

[Contrat de service]

interface publique IDBManagerService

    {

        [OperationContract]

        [FaultContract]

        void Save (Employé emp);

    }

Utilisation de returnUnknownExceptionsAsFaults

Vous pouvez utiliser l'attribut returnUnknownExceptionsAsFaults dans la configuration du comportement du service pour déclencher automatiquement une exception en tant qu'erreur SOAP. L'extrait de code suivant illustre comment vous pouvez y parvenir.

                 returnUnknownExceptionsAsFaults = "True">

Gestion des exceptions à l'échelle mondiale

Une autre façon de gérer les exceptions dans WCF consiste à implémenter l'interface IErrorHandler sur votre classe de service pour gérer toutes les exceptions globalement et fournir une exception FaultException compatible SOAP. Cette interface contient deux méthodes: HandleError et provideFault. Alors que le premier est utilisé pour effectuer une activité avec l'erreur, le second est utilisé pour renvoyer un message d'erreur. Notez que vous pouvez également configurer IErrorHandler (l'activer ou le désactiver) dans votre fichier configurable de service.