Partager via


Extension du contrôle sur la gestion des erreurs et la création de rapports

L’exemple ErrorHandling montre comment étendre le contrôle sur la gestion des erreurs et les rapports d’erreurs dans un service Windows Communication Foundation (WCF) à l’aide de l’interfaceIErrorHandler. L’exemple est basé sur la prise en main d’un code supplémentaire ajouté au service pour gérer les erreurs. Le client force plusieurs conditions d’erreur. Le service intercepte les erreurs et les enregistre dans un fichier.

Remarque

La procédure d’installation et les instructions de génération de cet exemple se trouvent à la fin de cette rubrique.

Les services peuvent intercepter des erreurs, effectuer le traitement et affecter la façon dont les erreurs sont signalées à l’aide de l’interface IErrorHandler . L’interface a deux méthodes qui peuvent être implémentées : ProvideFault(Exception, MessageVersion, Message) et HandleError. La ProvideFault(Exception, MessageVersion, Message) méthode vous permet d’ajouter, de modifier ou de supprimer un message d’erreur généré en réponse à une exception. La HandleError méthode permet le traitement des erreurs en cas d’erreur et contrôle si la gestion des erreurs supplémentaire peut s’exécuter.

Dans cet exemple, le CalculatorErrorHandler type implémente l’interface IErrorHandler . Dans le

HandleError méthode, écrit CalculatorErrorHandler un journal de l’erreur dans un fichier texte Error.txt dans c :\logs. Notez que l’exemple enregistre l’erreur et ne le supprime pas, ce qui lui permet d’être renvoyé au client.

public class CalculatorErrorHandler : IErrorHandler
{
    // Provide a fault. The Message fault parameter can be replaced, or set to
    // null to suppress reporting a fault.

    public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
    {
    }

    // HandleError. Log an error, then allow the error to be handled as usual.
    // Return true if the error is considered as already handled

    public bool HandleError(Exception error)
    {
        using (TextWriter tw = File.AppendText(@"c:\logs\error.txt"))
        {
            if (error != null)
            {
                tw.WriteLine("Exception: " + error.GetType().Name + " - " + error.Message);
            }
            tw.Close();
        }
        return true;
    }
}

Il ErrorBehaviorAttribute existe en tant que mécanisme permettant d’inscrire un gestionnaire d’erreurs auprès d’un service. Cet attribut prend un paramètre de type unique. Ce type doit implémenter l’interface IErrorHandler et avoir un constructeur public et vide. L’attribut instancie ensuite une instance de ce type de gestionnaire d’erreurs et l’installe dans le service. Pour ce faire, implémentez l’interface IServiceBehavior , puis utilisez la ApplyDispatchBehavior méthode pour ajouter des instances du gestionnaire d’erreurs au service.

// This attribute can be used to install a custom error handler for a service.
public class ErrorBehaviorAttribute : Attribute, IServiceBehavior
{
    Type errorHandlerType;

    public ErrorBehaviorAttribute(Type errorHandlerType)
    {
        this.errorHandlerType = errorHandlerType;
    }

    void IServiceBehavior.Validate(ServiceDescription description, ServiceHostBase serviceHostBase)
    {
    }

    void IServiceBehavior.AddBindingParameters(ServiceDescription description, ServiceHostBase serviceHostBase, System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints, BindingParameterCollection parameters)
    {
    }

    void IServiceBehavior.ApplyDispatchBehavior(ServiceDescription description, ServiceHostBase serviceHostBase)
    {
        IErrorHandler errorHandler;

        try
        {
            errorHandler = (IErrorHandler)Activator.CreateInstance(errorHandlerType);
        }
        catch (MissingMethodException e)
        {
            throw new ArgumentException("The errorHandlerType specified in the ErrorBehaviorAttribute constructor must have a public empty constructor.", e);
        }
        catch (InvalidCastException e)
        {
            throw new ArgumentException("The errorHandlerType specified in the ErrorBehaviorAttribute constructor must implement System.ServiceModel.Dispatcher.IErrorHandler.", e);
        }

        foreach (ChannelDispatcherBase channelDispatcherBase in serviceHostBase.ChannelDispatchers)
        {
            ChannelDispatcher channelDispatcher = channelDispatcherBase as ChannelDispatcher;
            channelDispatcher.ErrorHandlers.Add(errorHandler);
        }
    }
}

L’exemple implémente un service de calculatrice. Le client provoque délibérément deux erreurs sur le service en fournissant des paramètres avec des valeurs illégales. L’interface CalculatorErrorHandler utilise l’interface IErrorHandler pour consigner les erreurs dans un fichier local, puis les permet de renvoyer au client. Le client force une division par zéro et une condition d’argument hors plage.

try
{
    Console.WriteLine("Forcing an error in Divide");
    // Call the Divide service operation - trigger a divide by 0 error.
    value1 = 22;
    value2 = 0;
    result = proxy.Divide(value1, value2);
    Console.WriteLine("Divide({0},{1}) = {2}", value1, value2, result);
}
catch (FaultException e)
{
    Console.WriteLine("FaultException: " + e.GetType().Name + " - " + e.Message);
}
catch (Exception e)
{
    Console.WriteLine("Exception: " + e.GetType().Name + " - " + e.Message);
}

Lorsque vous exécutez l’exemple, les demandes et réponses de l’opération s’affichent dans la fenêtre de la console cliente. Vous voyez la division par zéro et les conditions d’argument hors plage signalées comme des erreurs. Appuyez sur Entrée dans la fenêtre du client pour arrêter le client.

Add(15,3) = 18
Subtract(145,76) = 69
Multiply(9,81) = 729
Forcing an error in Divide
FaultException: FaultException - Invalid Argument: The second argument must not be zero.
Forcing an error in Factorial
FaultException: FaultException - Invalid Argument: The argument must be greater than zero.

Press <ENTER> to terminate client.

Le fichier c :\logs\errors.txt contient les informations journalisées sur les erreurs par le service. Notez que pour que le service écrive dans le répertoire, vous devez vous assurer que le processus sous lequel le service s’exécute (généralement ASP.NET ou service réseau) est autorisé à écrire dans le répertoire.

Fault: Reason = Invalid Argument: The second argument must not be zero.
Fault: Reason = Invalid Argument: The argument must be greater than zero.

Pour configurer, générer et exécuter l’exemple

  1. Assurez-vous d’avoir effectué la Procédure d’installation unique pour les exemples Windows Communication Foundation.

  2. Pour générer la solution, suivez les instructions de Création des exemples Windows Communication Foundation.

  3. Vérifiez que vous avez créé le fichier c :\logs directory for the error.txt. Ou modifiez le nom de fichier utilisé dans CalculatorErrorHandler.HandleError.

  4. Pour exécuter l’exemple dans une configuration à un ou plusieurs ordinateurs, conformez-vous aux instructions figurant dans la rubrique Exécution des exemples Windows Communication Foundation.