Vorgehensweise: Zugreifen auf Dienste mit einem DuplexvertragHow to: Access services with a duplex contract

Eine Funktion von Windows Communication Foundation (WCF), ist die Fähigkeit zum Erstellen eines Diensts, das ein duplexnachrichtenmuster verwendet.One feature of Windows Communication Foundation (WCF) is the ability to create a service that uses a duplex messaging pattern. Anhand dieses Musters kann ein Dienst mit dem Client über einen Rückruf kommunizierenThis pattern allows a service to communicate with the client through a callback. In diesem Thema wird gezeigt, die Schritte zum Erstellen von eines WCF-Clients in einer Clientklasse, die die Rückrufschnittstelle implementiert wird.This topic shows the steps to create a WCF client in a client class that implements the callback interface.

Eine Dualbindung macht die IP-Adresse des Clients für den Dienst verfügbar.A dual binding exposes the IP address of the client to the service. Der Client sollte Sicherheit eingestellt haben, um sicherzustellen, dass nur Verbindungen zu vertrauensvollen Diensten hergestellt werden.The client should use security to ensure that it connects only to services it trusts.

Ein Lernprogramm zum Erstellen einer grundlegenden WCF-Dienst und Client finden Sie unter Lernprogramm für erste Schritte.For a tutorial on creating a basic WCF service and client, see Getting Started Tutorial.

So greifen Sie auf einen Duplexdienst zuTo access a duplex service

  1. Erstellen Sie einen Dienst, der zwei Schnittstellen enthält.Create a service that contains two interfaces. Die erste Schnittstelle ist dem Dienst vorbehalten, die zweite Schnittstelle wird für den Rückruf verwendet.The first interface is for the service, the second is for the callback. Weitere Informationen zu einen Duplexdienst zu erstellen, finden Sie unter Vorgehensweise: Erstellen eines Duplexvertrags.For more information about creating a duplex service, see How to: Create a Duplex Contract.

  2. Führen Sie den Dienst aus.Run the service.

  3. Verwenden der ServiceModel Metadata Utility Tool (Svcutil.exe) Generieren von Datenverträgen (Schnittstellen) für den Client.Use the ServiceModel Metadata Utility Tool (Svcutil.exe) to generate contracts (interfaces) for the client. Informationen hierzu finden Sie unter Vorgehensweise: Erstellen eines Clients.For information about how to do this, see How to: Create a Client.

  4. Implementieren Sie die Rückrufschnittstelle in der Client-Klasse, wie im nachfolgenden Beispiel dargestellt.Implement the callback interface in the client class, as shown in the following example.

    public class CallbackHandler : ICalculatorDuplexCallback
    {
        public void Result(double result)
        {
            Console.WriteLine("Result ({0})", result);
        }
        public void Equation(string equation)
        {
            Console.WriteLine("Equation({0})", equation);
        }
    }
    
    Public Class CallbackHandler
    Implements ICalculatorDuplexCallback
       Public Sub Result (ByVal result As Double)
          Console.WriteLine("Result ({0})", result)
       End Sub
        Public Sub Equation(ByVal equation As String)
            Console.Writeline("Equation({0})", equation)
        End Sub
    End Class
    
  5. Erstellen Sie eine Instanz der InstanceContext-Klasse.Create an instance of the InstanceContext class. Der Konstruktor benötigt eine Instanz der Client-Klasse.The constructor requires an instance of the client class.

    InstanceContext site = new InstanceContext(new CallbackHandler());
    
    Dim site As InstanceContext = New InstanceContext(new CallbackHandler())
    
  6. Erstellen Sie eine Instanz des WCF-Clients mithilfe des Konstruktors, der erfordert ein InstanceContext Objekt.Create an instance of the WCF client using the constructor that requires an InstanceContext object. Der zweite Parameter des Konstruktors ist der Name eines Endpunkts in der Konfigurationsdatei.The second parameter of the constructor is the name of an endpoint found in the configuration file.

    CalculatorDuplexClient wcfClient = new CalculatorDuplexClient(site, "default");
    
    Dim wcfClient As New CalculatorDuplexClient(site, "default")
    
  7. Rufen Sie die Methoden des WCF-Clients als erforderlich.Call the methods of the WCF client as required.

BeispielExample

Im folgenden Codebeispiel wird das Erstellen einer Client-Klasse veranschaulicht, die auf einen Duplexvertrag zugreift.The following code example demonstrates how to create a client class that accesses a duplex contract.

using System;
using System.ServiceModel;
using System.ServiceModel.Channels;

// Define class that implements the callback interface of duplex 
// contract.
public class CallbackHandler : ICalculatorDuplexCallback
{
  public void Result(double result)
  {
    Console.WriteLine("Result({0})", result);
  }
  public void Equation(string equation)
  {
    Console.WriteLine("Equation({0})", equation);
  }
}


public class Client
{
  public static void Main()
  {
    // Picks up configuration from the config file.
    
    CalculatorDuplexClient wcfClient
      = new CalculatorDuplexClient(new InstanceContext(new CallbackHandler()));
    try
    {
      // Call the AddTo service operation.
      double value = 100.00D;
      wcfClient.AddTo(value);

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

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

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

      // Complete equation.
      wcfClient.Clear();

      // Wait for callback messages to complete before
      // closing.
      System.Threading.Thread.Sleep(5000);

      // Close the WCF client.
      wcfClient.Close();
      Console.WriteLine("Done!");
    }
    catch (TimeoutException timeProblem)
    {
      Console.WriteLine("The service operation timed out. " + timeProblem.Message);
      wcfClient.Abort();
      Console.Read();
    }
    catch (CommunicationException commProblem)
    {
      Console.WriteLine("There was a communication problem. " + commProblem.Message);
      wcfClient.Abort();
      Console.Read();
    }
  }
}
Imports System
Imports System.ServiceModel

Namespace Microsoft.ServiceModel.Samples

    ' The service contract is defined in generatedClient.vb, generated from the service by the svcutil tool.

    ' Define class which implements callback interface of duplex contract
    Public Class CallbackHandler
        Implements ICalculatorDuplexCallback

        Public Sub Result(ByVal result As Double) Implements ICalculatorDuplexCallback.Result
            Console.WriteLine("Result({0})", result)
        End Sub

        Public Sub Equation(ByVal eqn As String) Implements ICalculatorDuplexCallback.Equation
            Console.WriteLine("Equation({0})", eqn)
        End Sub
    End Class

    Class Client
        Public Shared Sub Main()

            ' Construct InstanceContext to handle messages on callback interface
            Dim instanceContext As New InstanceContext(New CallbackHandler())

            ' Create a client
            Dim wcfClient As New CalculatorDuplexClient(instanceContext)
            Console.WriteLine("Press <ENTER> to terminate client once the output is displayed.")
            Console.WriteLine()

            Try
                ' Call the AddTo service operation.
                Dim value As Double = 100
                wcfClient.AddTo(value)

                ' Call the SubtractFrom service operation.
                value = 50
                wcfClient.SubtractFrom(value)

                ' Call the MultiplyBy service operation.
                value = 17.65
                wcfClient.MultiplyBy(value)

                ' Call the DivideBy service operation.
                value = 2
                wcfClient.DivideBy(value)

                ' Complete equation
                wcfClient.Clear()

                Console.ReadLine()

                'Closing the client gracefully closes the connection and cleans up resources
                wcfClient.Close()

            Catch timeout As TimeoutException
                Console.WriteLine(timeout.Message)
                wcfClient.Abort()
            Catch commException As CommunicationException
                Console.WriteLine(commException.Message)
                wcfClient.Abort()
            End Try
        End Sub

    End Class

End Namespace

Siehe auchSee also

Tutorial mit ersten SchrittenGetting Started Tutorial
Vorgehensweise: Erstellen eines DuplexvertragsHow to: Create a Duplex Contract
ServiceModel Metadata Utility-Tool (Svcutil.exe)ServiceModel Metadata Utility Tool (Svcutil.exe)
Vorgehensweise: Erstellen eines ClientsHow to: Create a Client
Vorgehensweise: Verwenden von ChannelFactoryHow to: Use the ChannelFactory