StandardnachrichtenvertragDefault Message Contract

Das Beispiel zum Standardnachrichtenvertrag zeigt einen Dienst, bei dem eine benutzerdefinierte Nachricht an und aus Dienstvorgängen übergeben wird.The Default Message Contract sample demonstrates a service where a custom user-defined message is passed to and from service operations. Dieses Beispiel basiert auf der Einstieg , der eine Rechnerschnittstelle als typisierte Dienst implementiert.This sample is based on the Getting Started that implements a calculator interface as a typed service. Anstatt die einzelnen Dienstvorgänge für Addition, Subtraktion, Multiplikation und Division verwendet der Einstieg, in diesem Beispiel übergibt eine benutzerdefinierte Meldung, die sowohl die Operanden und den Operator enthält, und gibt zurück Das Ergebnis der arithmetischen Berechnung.Instead of the individual service operations for addition, subtraction, multiplication, and division used in the Getting Started, this sample passes a custom message that contains both the operands and the operator, and returns the result of the arithmetic calculation.

Der Client ist ein Konsolenprogramm (.exe), und die Dienstbibliothek (.dll) wird von IIS (Internet Information Services, Internetinformationsdienste) gehostet.The client is a console program (.exe) and the service library (.dll) is hosted by Internet Information Services (IIS). Die Clientaktivität ist im Konsolenfenster sichtbar.Client activity is visible in the console window.

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.

In dem Dienst ist ein Dienstvorgang definiert, der benutzerdefinierte Nachrichten vom Typ MyMessage entgegennimmt und zurückgibt.In the service, a single service operation is defined that accepts and returns custom messages of type MyMessage. Auch wenn im vorliegenden Beispiel die Anforderung- und Antwortnachrichten vom selben Typ sind, können sie natürlich auch unterschiedliche Nachrichtenverträge sein, falls erforderlich.Although in this sample the request and response messages are of the same type, they could of course be different message contracts if necessary.

[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]  
public interface ICalculator  
{  
    [OperationContract(Action="http://test/MyMessage_action",  
                  ReplyAction="http://test/MyMessage_action")]  
    MyMessage Calculate(MyMessage request);  
}  

Die benutzerdefinierte MyMessage-Nachricht wird in einer mit MessageContractAttribute, MessageHeaderAttribute- und MessageBodyMemberAttribute-Attributen kommentierten Klasse definiert.The custom message MyMessage is defined in a class annotated with MessageContractAttribute, MessageHeaderAttribute and MessageBodyMemberAttribute attributes. In diesem Beispiel wird nur der dritte Konstruktor verwendet.Only the third constructor is used in this sample. Mithilfe von Nachrichtenverträgen können Sie die volle Kontrolle über die SOAP-Nachricht ausüben.Using message contracts allows you to exercise full control over the SOAP message. In diesem Beispiel wird mit dem MessageHeaderAttribute-Attribut Operation in einem SOAP-Header platziert.In this sample, the MessageHeaderAttribute attribute is used to put Operation in a SOAP header. Die Operanden N1 und N2 sowie das Result werden im SOAP-Text angezeigt, da auf sie das MessageBodyMemberAttribute-Attribut angewendet ist.The operands N1, N2 and the Result appear within the SOAP body because they have the MessageBodyMemberAttribute attribute applied.

[MessageContract]  
public class MyMessage  
{  
    private string operation;  
    private double n1;  
    private double n2;  
    private double result;  

    //Constructor - create an empty message.  

    public MyMessage() {}  

    //Constructor - create a message and populate its members.  

    public MyMessage(double n1, double n2, string operation,   
                     double result)  
    {  
        this.n1 = n1;  
        this.n2 = n2;  
        this.operation = operation;  
        this.result = result;  
    }  

    //Constructor - create a message from another message.  

    public MyMessage(MyMessage message)  
    {  
        this.n1 = message.n1;  
        this.n2 = message.n2;  
        this.operation = message.operation;  
        this.result = message.result;  
    }  

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

    [MessageBodyMember]  
    public double N1  
    {  
        get { return n1; }  
        set { n1 = value; }  
    }  

    [MessageBodyMember]  
    public double N2  
    {  
        get { return n2; }  
        set { n2 = value; }  
    }  

    [MessageBodyMember]  
    public double Result  
    {  
        get { return result; }  
        set { result = value; }  
    }  
}  

Die Implementierungsklasse enthält den Code für den Calculate-Dienstvorgang.The implementation class contains the code for the Calculate service operation. Die CalculateService-Klasse ermittelt die Operanden und den Operator aus der Anforderungsnachricht und erstellt eine Antwortnachricht, die das Ergebnis der angeforderten Berechnung enthält, wie im folgenden Code dargestellt.The CalculateService class obtains the operands and operator from the request message and creates a response message that contains the result of the requested calculation, as shown in the following sample code.

// Service class which implements the service contract.  
public class CalculatorService : ICalculator  
{  
    // Perform a calculation.  

    public MyMessage Calculate(MyMessage request)  
    {  
        MyMessage response = new MyMessage(request);  
        switch (request.Operation)  
        {  
            case "+":  
                response.Result = request.N1 + request.N2;  
                break;  
            case "-":  
                response.Result = request.N1 - request.N2;  
                break;  
            case "*":  
                response.Result = request.N1 * request.N2;  
                break;  
            case "/":  
                response.Result = request.N1 / request.N2;  
                break;  
            default:  
                response.Result = 0.0D;  
                break;  
        }  
        return response;  
    }  
}  

Der generierte Clientcode für den Client mit der Erstellung der ServiceModel Metadata Utility Tool (Svcutil.exe) Tool.The generated client code for the client was created with the ServiceModel Metadata Utility Tool (Svcutil.exe) tool. Wenn erforderlich, erstellt das Tool automatisch Nachrichtenvertragstypen im generierten Clientcode.The tool automatically creates message contract types in the generated client code if necessary. Die /messageContract-Befehlsoption kann angegeben werden, um die Generierung von Nachrichtenverträgen zu erzwingen.The /messageContract command option may be specified to force the generation of message contracts.

svcutil.exe /n:"http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples" /o:client\generatedClient.cs http://localhost/servicemodelsamples/service.svc/mex  

Das folgende Codebeispiel zeigt den Client mit der MyMessage-Nachricht.The following sample code demonstrates the client using the MyMessage message.

// Create a client with given client endpoint configuration  
CalculatorClient client = new CalculatorClient();  

// Perform addition using a typed message.  

MyMessage request = new MyMessage();  
request.N1 = 100D;  
request.N2 = 15.99D;  
request.Operation = "+";  
MyMessage response = ((ICalculator)client).Calculate(request);  
Console.WriteLine("Add({0},{1}) = {2}", request.N1, request.N2, response.Result);  

Wenn Sie das Beispiel ausführen, werden die Berechnungen im Clientkonsolenfenster angezeigt.When you run the sample, the calculations are displayed in the client console window. 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(100,15.99) = 115.99  
Subtract(145,76.54) = 68.46  
Multiply(9,81.25) = 731.25  
Divide(22,7) = 3.14285714285714  

Press <ENTER> to terminate client.  

An dieser Stelle wurden benutzerdefinierte Nachrichten zwischen dem Client und dem Dienstvorgang übergeben.At this point, custom user-defined messages have passed between the client and the service operation. Der Nachrichtenvertrag hat definiert, dass sich die Operanden und Ergebnisse im Nachrichtentextteil und der Operator in einem Nachrichtenheader befinden.The message contract defined that the operands and results were in the message body and that the operator was in a message header. Zum Betrachten dieser Nachrichtenstruktur kann Nachrichtenprotokollierung konfiguriert werden.Message logging can be configured to observe this message structure.

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, 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\Basic\Contract\Message\Default

Siehe auchSee Also