DuplexDuplex

Im Duplexbeispiel wird das Definieren und Implementieren eines Duplexvertrags veranschaulicht.The Duplex sample demonstrates how to define and implement a duplex contract. Duplexkommunikation findet statt, wenn ein Client eine Sitzung mit einem Dienst einrichtet und dem Dienst einen Kanal bereitstellt, über den der Dienst Nachrichten zurück an den Client senden kann.Duplex communication occurs when a client establishes a session with a service and gives the service a channel on which the service can send messages back to the client. Dieses Beispiel basiert auf der Einstieg.This sample is based on the Getting Started. Ein Duplexvertrag wird als Paar von Schnittstellen definiert: eine primäre Schnittstelle vom Client zum Dienst und eine Rückrufschnittstelle vom Dienst zum Client.A duplex contract is defined as a pair of interfaces—a primary interface from the client to the service and a callback interface from the service to the client. In diesem Beispiel kann der Client durch die ICalculatorDuplex-Schnittstelle mathematische Operationen ausführen (Berechnen eines Ergebnisses über eine Sitzung).In this sample, the ICalculatorDuplex interface allows the client to perform math operations, calculating the result over a session. Der Dienst gibt Ergebnisse auf der ICalculatorDuplexCallback-Schnittstelle zurück.The service returns results on the ICalculatorDuplexCallback interface. Ein Duplexvertrag erfordert eine Sitzung, da ein Kontext eingerichtet werden muss, um die zwischen dem Client und dem Dienst gesendeten Nachrichten in Beziehung zu setzen.A duplex contract requires a session, because a context must be established to correlate the set of messages being sent between the client and 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.

In diesem Beispiel ist der Client eine Konsolenanwendung (.exe), und der Dienst wird von IIS (Internet Information Services, Internetinformationsdienste) gehostet.In this sample, the client is a console application (.exe) and the service is hosted by Internet Information Services (IIS). Der Duplexvertrag wird wie folgt definiert:The duplex contract is defined as follows:

[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples", SessionMode=SessionMode.Required,  
                 CallbackContract=typeof(ICalculatorDuplexCallback))]  
public interface ICalculatorDuplex  
{  
    [OperationContract(IsOneWay = true)]  
    void Clear();  
    [OperationContract(IsOneWay = true)]  
    void AddTo(double n);  
    [OperationContract(IsOneWay = true)]  
    void SubtractFrom(double n);  
    [OperationContract(IsOneWay = true)]  
    void MultiplyBy(double n);  
    [OperationContract(IsOneWay = true)]  
    void DivideBy(double n);  
}  

public interface ICalculatorDuplexCallback  
{  
    [OperationContract(IsOneWay = true)]  
    void Result(double result);  
    [OperationContract(IsOneWay = true)]  
    void Equation(string eqn);  
}  

Die CalculatorService-Klasse implementiert die primäre ICalculatorDuplex-Schnittstelle.The CalculatorService class implements the primary ICalculatorDuplex interface. Der Dienst verwendet den PerSession-Instanzmodus, um die Ergebnisse für die einzelnen Sitzungen zu pflegen.The service uses the PerSession instance mode to maintain the result for each session. Die private Callback-Eigenschaft wird zum Zugriff auf den Rückrufkanal zum Client verwendet.A private property named Callback is used to access the callback channel to the client. Der Dienst verwendet den Rückruf, um über die Rückrufschnittstelle Nachrichten zurück an den Client zu senden.The service uses the callback for sending messages back to the client through the callback interface.

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]  
public class CalculatorService : ICalculatorDuplex  
{  
    double result = 0.0D;  
    string equation;  

    public CalculatorService()  
    {  
        equation = result.ToString();  
    }  

    public void Clear()  
    {  
        Callback.Equation(equation + " = " + result.ToString());  
        equation = result.ToString();  
    }  

    public void AddTo(double n)  
    {  
        result += n;  
        equation += " + " + n.ToString();  
        Callback.Result(result);  
    }  
    ...  
    ICalculatorDuplexCallback Callback  
    {  
        get  
        {  
            return OperationContext.Current.GetCallbackChannel<ICalculatorDuplexCallback>();  
        }  
    }  
}  

Damit Nachrichten vom Dienst empfangen werden können, muss der Client eine Klasse bereitstellen, die die Rückrufschnittstelle des Duplexvertrags implementiert.The client must provide a class that implements the callback interface of the duplex contract, for receiving messages from the service. Im Beispiel wird eine CallbackHandler-Klasse definiert, um die ICalculatorDuplexCallback-Schnittstelle zu implementieren.In the sample, a CallbackHandler class is defined to implement the ICalculatorDuplexCallback interface.

public class CallbackHandler : ICalculatorDuplexCallback  
{  
   public void Result(double result)  
   {  
      Console.WriteLine("Result({0})", result);  
   }  

   public void Equation(string equation)  
   {  
      Console.WriteLine("Equation({0}", equation);  
   }  
}  

Für den für einen Duplexvertrag erzeugten Proxy muss ein InstanceContext bei der Erstellung bereitgestellt werden.The proxy that is generated for a duplex contract requires a InstanceContext to be provided upon construction. Dieser InstanceContext wird als Standort für ein Objekt verwendet, das die Rückrufschnittstelle implementiert und die vom Dienst zurückgesendeten Nachrichten verarbeitet.This InstanceContext is used as the site for an object that implements the callback interface and handles messages that are sent back from the service. Ein InstanceContext wird mit einer Instanz der CallbackHandler-Klasse erstellt.An InstanceContext is constructed with an instance of the CallbackHandler class. Dieses Objekt verarbeitet die vom Dienst über die Rückrufschnittstelle an den Client gesendeten Nachrichten.This object handles messages sent from the service to the client on the callback interface.

// Construct InstanceContext to handle messages on callback interface.  
InstanceContext instanceContext = new InstanceContext(new CallbackHandler());  

// Create a client.  
CalculatorDuplexClient client = new CalculatorDuplexClient(instanceContext);  

Console.WriteLine("Press <ENTER> to terminate client once the output is displayed.");  
Console.WriteLine();  

// Call the AddTo service operation.  
double value = 100.00D;  
client.AddTo(value);  

// Call the SubtractFrom service operation.  
value = 50.00D;  
client.SubtractFrom(value);  

// Call the MultiplyBy service operation.  
value = 17.65D;  
client.MultiplyBy(value);  

// Call the DivideBy service operation.  
value = 2.00D;  
client.DivideBy(value);  

// Complete equation.  
client.Clear();  

Console.ReadLine();  

//Closing the client gracefully closes the connection and cleans up resources.  
client.Close();  

Die Konfiguration muss so geändert werden, dass eine Bindung bereitgestellt wird, die sowohl eine Sitzungskommunikation als auch eine Duplexkommunikation unterstützt.The configuration has been modified to provide a binding that supports both session communication and duplex communication. wsDualHttpBinding unterstützt die sitzungsbasierte Kommunikation und ermöglicht durch Bereitstellung dualer HTTP-Verbindungen (eine Verbindung pro Richtung) auch eine Duplexkommunikation.The wsDualHttpBinding supports session communication and allows duplex communication by providing dual HTTP connections, one for each direction. Auf dem Dienst ist der einzige Unterschied in der Konfiguration die verwendete Bindung.On the service, the only difference in configuration is the binding that is used. Auf dem Client muss, wie in der folgenden Beispielkonfiguration dargestellt, eine Adresse konfiguriert werden, über die der Server eine Verbindung mit dem Client herstellen kann.On the client, you must configure an address that the server can use to connect to the client as shown in the following sample configuration.

<client>  
  <endpoint name=""  
            address="http://localhost/servicemodelsamples/service.svc"   
            binding="wsDualHttpBinding"   
            bindingConfiguration="DuplexBinding"   
            contract="Microsoft.ServiceModel.Samples.ICalculatorDuplex" />  
</client>  

<bindings>  
  <!-- Configure a binding that support duplex communication. -->  
  <wsDualHttpBinding>  
    <binding name="DuplexBinding"   
             clientBaseAddress="http://localhost:8000/myClient/">  
    </binding>  
  </wsDualHttpBinding>  
</bindings>  

Wenn Sie das Beispiel ausführen, werden die auf dem Client zurückgegebenen Nachrichten in der vom Dienst gesendeten Rückrufschnittstelle angezeigt.When you run the sample, you see the messages that are returned to the client on the callback interface that is sent from the service. Alle Zwischenergebnisse werden angezeigt, gefolgt von der ganzen Formel nach Abschluss aller Vorgänge.Each intermediate result is displayed, followed by the entire equation upon the completion of all operations. Drücken Sie die EINGABETASTE, um den Client zu schließen.Press ENTER to shut down the client.

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 C#-, C++ oder Visual Basic .NET Edition der Lösung die Anweisungen im Erstellen der Windows Communication Foundation-Beispiele.To build the C#, 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

    Wenn den Client in einer computerübergreifenden Konfiguration ausführen, achten Sie darauf, ersetzen Sie "Localhost" in beiden die address Attribut des der Endpunkt Element und die clientBaseAddress Attribut des der < Binden von > Element von der <WsDualHttpBinding > Element mit dem Namen des entsprechenden Computers an, wie im folgenden gezeigt:When running the client in a cross-machine configuration, be sure to replace "localhost" in both the address attribute of the endpoint element and the clientBaseAddress attribute of the <binding> element of the <wsDualHttpBinding> element with the name of the appropriate machine, as shown in the following:

    <client>  
    <endpoint name = ""  
    address="http://service_machine_name/servicemodelsamples/service.svc"  
    ... />  
    </client>  
    ...  
    <wsDualHttpBinding>  
    <binding name="DuplexBinding" clientBaseAddress="http://client_machine_name:8000/myClient/">  
    </binding>  
    </wsDualHttpBinding>  
    

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\Duplex

Siehe auchSee Also