FehlervertragFault Contract

Im Fehlervertragsbeispiel wird veranschaulicht, wie Fehlerinformationen von einem Dienst zu einem Client übermittelt werden.The Fault Contract sample demonstrates how to communicate error information from a service to a client. Das Beispiel basiert auf der Einstieg, mit zusätzlicher Code hinzugefügt, mit dem Dienst um eine interne Ausnahme in einen Fehler zu konvertieren.The sample is based on the Getting Started, with some additional code added to the service to convert an internal exception to a fault. Der Client versucht, eine Division durch 0 (null) auszuführen, um einen Fehlerzustand beim Dienst zu erzwingen.The client attempts to perform division by zero to force an error condition on the service.

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.

Der Rechnervertrag wurde geändert, um ein FaultContractAttribute einzuschließen, wie im folgenden Beispielcode gezeigt.The calculator contract has been modified to include a FaultContractAttribute as shown in the following sample code.

[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]  
public interface ICalculator  
{  
    [OperationContract]  
    int Add(int n1, int n2);  
    [OperationContract]  
    int Subtract(int n1, int n2);  
    [OperationContract]  
    int Multiply(int n1, int n2);  
    [OperationContract]  
    [FaultContract(typeof(MathFault))]  
    int Divide(int n1, int n2);  
}  

Das FaultContractAttribute-Attribut gibt an, dass der Divide-Vorgang möglicherweise einen Fehler vom Typ MathFault zurückgibt.The FaultContractAttribute attribute indicates that the Divide operation may return a fault of type MathFault. Ein Fehler kann von jedem Typ sein, der serialisiert werden kann.A fault can be of any type that can be serialized. In diesem Fall ist der MathFault ein Datenvertrag, wie im Folgenden dargestellt:In this case, the MathFault is a data contract, as follows:

[DataContract(Namespace="http://Microsoft.ServiceModel.Samples")]  
public class MathFault  
{      
    private string operation;  
    private string problemType;  

    [DataMember]  
    public string Operation  
    {  
        get { return operation; }  
        set { operation = value; }  
    }  

    [DataMember]          
    public string ProblemType  
    {  
        get { return problemType; }  
        set { problemType = value; }  
    }  
}  

Die Divide-Methode löst eine FaultException<TDetail>-Ausnahme aus, wenn eine Ausnahme durch Division durch 0 (null) auftritt, wie im folgenden Beispielcode dargestellt.The Divide method throws a FaultException<TDetail> exception when a divide by zero exception occurs as shown in the following sample code. Diese Ausnahme führt dazu, dass ein Fehler an den Client gesendet wird.This exception results in a fault being sent to the client.

public int Divide(int n1, int n2)  
{  
    try  
    {  
        return n1 / n2;  
    }  
    catch (DivideByZeroException)  
    {  
        MathFault mf = new MathFault();  
        mf.operation = "division";  
        mf.problemType = "divide by zero";  
        throw new FaultException<MathFault>(mf);  
    }  
}  

Der Clientcode erzwingt einen Fehler, indem eine Division durch 0 (null) angefordert wird.The client code forces an error by requesting a division by zero. 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 0 (null) als Fehler gemeldet wird.You see the division by zero being reported as a fault. 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  
FaultException<MathFault>: Math fault while doing division. Problem: divide by zero  

Press <ENTER> to terminate client.  

Der Client fängt hierzu die entsprechende FaultException<MathFault>-Ausnahme ab:The client does this by catching the appropriate FaultException<MathFault> exception:

catch (FaultException<MathFault> e)  
{  
    Console.WriteLine("FaultException<MathFault>: Math fault while doing " + e.Detail.operation + ". Problem: " + e.Detail.problemType);  
    client.Abort();  
}  

In der Standardeinstellung werden Details zu unerwarteten Ausnahmen nicht an den Client gesendet, damit verhindert wird, dass Informationen zur Dienstimplementierung die sichere Begrenzung des Diensts verlassen.By default, the details of unexpected exceptions are not sent to the client to prevent details of the service implementation from escaping the secure boundary of the service. FaultContract stellt eine Möglichkeit bereit, um Fehler in einem Vertrag so zu beschreiben und bestimmte Arten von Ausnahmen so zu kennzeichnen, dass sie für die Übertragung an den Client geeignet sind.FaultContract provides a way to describe faults in a contract and mark certain types of exceptions as appropriate for transmission to the client. FaultException<T> stellt einen Laufzeitmechanismus zum Senden von Fehlern an den Consumer bereit.FaultException<T> provides the run-time mechanism for sending faults to consumers.

Es ist jedoch hilfreich, die internen Details eines Dienstfehlers beim Debuggen anzuzeigen.However, it is useful to see the internal details of a service failure when debugging. Zum Deaktivieren des oben beschriebenen sicheren Verhaltens können Sie angeben, dass die Details zu allen unbehandelten Ausnahmen auf dem Server in den Fehler eingeschlossen werden sollen, der an den Client gesendet wird.To turn off the secure behavior previously described, you can indicate that the details of every unhandled exception on the server should be included in the fault that is sent to the client. Dies wird durch Festlegen von IncludeExceptionDetailInFaults auf true erreicht.This is accomplished by setting IncludeExceptionDetailInFaults to true. Sie können dies im Code festlegen oder in der Konfiguration, wie im folgenden Beispiel gezeigt.You can either set it in code, or in configuration as shown in the following sample.

<behaviors>  
  <serviceBehaviors>  
    <behavior name="CalculatorServiceBehavior">  
      <serviceMetadata httpGetEnabled="True"/>  
      <serviceDebug includeExceptionDetailInFaults="True" />  
    </behavior>  
  </serviceBehaviors>  
</behaviors>  

Darüber hinaus das Verhalten muss verknüpft werden, mit dem Dienst durch Festlegen der behaviorConfiguration Attribut des Diensts in der Konfigurationsdatei auf "calculatorservicebehavior"festgelegt.Further, the behavior must be associated with the service by setting the behaviorConfiguration attribute of the service in the configuration file to "CalculatorServiceBehavior".

Damit solche Fehler auf dem Client abgefangen werden, muss die nicht generische FaultException abgefangen werden.To catch such faults on the client, the non-generic FaultException must be caught.

Dieses Verhalten sollte nur für Debuggingzwecke verwendet und nie in der Produktion aktiviert werden.This behavior should only be used for debugging purposes and should never be enabled in production.

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. Um die C#- oder Visual Basic .NET-Edition der Projektmappe zu erstellen, befolgen Sie die unter Building the Windows Communication Foundation Samplesaufgeführten Anweisungen.To build the C# or Visual Basic .NET edition of the solution, follow the instructions in Building the Windows Communication Foundation Samples.

  3. 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, fahren Sie mit Windows Communication Foundation (WCF) und Windows Workflow Foundation (WF) Samples for .NET Framework 4 aller Windows Communication Foundation (WCF) herunterladen und WFWF Beispiele.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) and WFWF samples. Dieses Beispiel befindet sich im folgenden Verzeichnis.This sample is located in the following directory.

<InstallDrive>:\WF_WCF_Samples\WCF\Basic\Contract\Service\Faults

Siehe auchSee Also