Erweitern der Kontrolle über Fehlerbehandlung und -meldungExtending Control Over Error Handling and Reporting

Dieses Beispiel veranschaulicht, wie die Kontrolle über die Verarbeitung und Meldung von Fehlern in einem Windows Communication Foundation (WCF)Windows Communication Foundation (WCF)-Dienst mithilfe der IErrorHandler-Schnittstelle erweitert werden kann.This sample demonstrates how to extend control over error handling and error reporting in a Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) service using the IErrorHandler interface. Das Beispiel basiert auf der Einstieg mit zusätzlicher Code hinzugefügt, mit dem Dienst, um Fehler zu behandeln.The sample is based on the Getting Started with some additional code added to the service to handle errors. Der Client erzwingt verschiedene Fehlerbedingungen.The client forces several error conditions. Der Dienst fängt die Fehler ab und protokolliert sie in einer Datei.The service intercepts the errors and logs them in a file.

Hinweis

Die Setupprozedur und die Buildanweisungen für dieses Beispiel befinden sich am Ende dieses Themas.The setup procedure and build instructions for this sample are located at the end of this topic.

Dienste können Fehler abfangen, Verarbeitungen ausführen und beeinflussen, wie Fehler mithilfe der IErrorHandler-Schnittstelle gemeldet werden.Services can intercept errors, perform processing, and affect how errors are reported using the IErrorHandler interface. Die Schnittstelle besitzt zwei Methoden, die implementiert werden können: ProvideFault(Exception, MessageVersion, Message) und HandleError.The interface has two methods that can be implemented: ProvideFault(Exception, MessageVersion, Message) and HandleError. Mit der ProvideFault(Exception, MessageVersion, Message)-Methode können Sie eine Fehlermeldung, die bei einer Ausnahme generiert wird, hinzufügen, ändern oder unterdrücken.The ProvideFault(Exception, MessageVersion, Message) method allows you to add, modify, or suppress a fault message that is generated in response to an exception. Mit der HandleError-Methode können Sie die Verarbeitung von Fehlern bei einem Fehlerereignis zulassen und steuern, ob eine weitere Fehlerbehandlung ausgeführt werden kann.The HandleError method allows error processing to take place in the event of an error and controls whether additional error handling can run.

In diesem Beispiel implementiert der CalculatorErrorHandler-Typ die IErrorHandler-Schnittstelle.In this sample, the CalculatorErrorHandler type implements the IErrorHandler interface. In derIn the

HandleError-Methode protokolliert der CalculatorErrorHandler den Fehler in der Textdatei Error.txt in c:\logs.HandleError method, the CalculatorErrorHandler writes a log of the error to an Error.txt text file in c:\logs. Beachten Sie, dass das Beispiel den Fehler protokolliert, ihn aber nicht unterdrückt, so dass er wieder zurück an den Client gemeldet werden kann.Note that the sample logs the fault and does not suppress it, allowing it to be reported back to the 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;  
        }  
    }  

Das ErrorBehaviorAttribute dient als Mechanismus zum Registrieren eines Fehlerhandlers mit einem Dienst.The ErrorBehaviorAttribute exists as a mechanism to register an error handler with a service. Dieses Attribut nimmt einen einzelnen Typparameter entgegen.This attribute takes a single type parameter. Dieser Typ sollte die IErrorHandler-Schnittstelle implementieren und einen öffentlichen, leeren Konstruktor besitzen.That type should implement the IErrorHandler interface and should have a public, empty constructor. Das Attribut instanziiert dann eine Instanz dieses Fehlerhandlertyps und installiert sie im Dienst.The attribute then instantiates an instance of that error handler type and installs it into the service. Dazu wird die IServiceBehavior-Schnittstelle implementiert, und dann werden dem Dienst mithilfe der ApplyDispatchBehavior-Methode Instanzen des Fehlerhandlers hinzugefügt.It does this by implementing the IServiceBehavior interface and then using the ApplyDispatchBehavior method to add instances of the error handler to the 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);  
        }                                                  
    }  
}  

Das Beispiel implementiert einen Rechnerdienst.The sample implements a calculator service. Der Client verursacht im Dienst absichtlich zwei Fehler, indem er Parameter mit ungültigen Werten angibt.The client deliberately causes two errors to occur on the service by providing parameters with illegal values. Der CalculatorErrorHandler protokolliert mithilfe der IErrorHandler-Schnittstelle die Fehler in einer lokalen Datei und lässt dann zu, dass sie wieder zurück an den Client gemeldet werden.The CalculatorErrorHandler uses the IErrorHandler interface to log the errors to a local file and then allows them to be reported back to the client. Der Client erzwingt eine Division durch Null und einen Argument-außerhalb-des-Bereichs-Zustand.The client forces a divide by zero and an argument-out-of-range condition.

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);  
}  

Wenn Sie das Beispiel ausführen, werden die Anforderungen und Antworten für den Vorgang im Clientkonsolenfenster angezeigt.When you run the sample, the operation requests and responses are displayed in the client console window. Sie sehen, dass die Division durch Null und die Argument-außerhalb-des-Bereichs-Zustände als Fehler gemeldet werden.You see the division by zero and the argument-out-of-range conditions being reported as faults. Drücken Sie im Clientfenster die EINGABETASTE, um den Client zu schließen.Press ENTER in the client window to shut down the 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.  

Die Datei "C:\logs\errors.txt" enthält die vom Dienst zu den Fehlern protokollierten Informationen.The file c:\logs\errors.txt contains the information logged about the errors by the service. Beachten Sie, dass Sie sicherstellen müssen, dass der Prozess, unter dem der Dienst ausgeführt wird (meist ASP.NET oder Network Service), über Schreibberechtigungen für das Verzeichnis verfügt, damit der Dienst in das Verzeichnis schreiben kann.Note that for the service to write to the directory you must make sure that the process under which the service is running, (typically ASP.NET or Network Service), has the permission to write to the directory.

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

So können Sie das Beispiel einrichten, erstellen und ausführenTo set up, build, and run the sample

  1. Stellen Sie sicher, dass Sie ausgeführt haben die Setupprozedur für die Windows Communication Foundation-Beispiele zum einmaligen.Ensure that you have performed the One-Time Setup Procedure for the Windows Communication Foundation Samples.

  2. Führen Sie zum Erstellen der Projektmappe die Anweisungen im Erstellen der Windows Communication Foundation-Beispiele.To build the solution, follow the instructions in Building the Windows Communication Foundation Samples.

  3. Vergewissern Sie sich, dass Sie das Verzeichnis "c:\logs" für die Datei "error.txt" erstellt haben.Ensure you have created the c:\logs directory for the error.txt file. Sie können auch den in CalculatorErrorHandler.HandleError verwendeten Dateinamen ändern.Or modify the file name used in CalculatorErrorHandler.HandleError.

  4. Um das Beispiel in einer einzelnen oder computerübergreifenden Konfiguration ausführen möchten, folgen Sie den Anweisungen Ausführen der Windows Communication Foundation-Beispiele.To run the sample in a single- or cross-machine configuration, follow the instructions in Running the Windows Communication Foundation Samples.

Wichtig

Die Beispiele sind möglicherweise bereits auf dem Computer installiert.The samples may already be installed on your machine. Suchen Sie nach dem folgenden Verzeichnis (Standardverzeichnis), bevor Sie fortfahren.Check for the following (default) directory before continuing.

<InstallDrive>:\WF_WCF_Samples

Wenn dieses Verzeichnis nicht vorhanden ist, rufen Sie Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4 auf, um alle Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) - und WFWF -Beispiele herunterzuladen.If this directory does not exist, go to Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4 to download all Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) and WFWF samples. Dieses Beispiel befindet sich im folgenden Verzeichnis.This sample is located in the following directory.

<InstallDrive>:\WF_WCF_Samples\WCF\Extensibility\ErrorHandling

Siehe auchSee Also