Dela via


Anvisningar: Få åtkomst till tjänster med ett duplex-kontrakt

En funktion i Windows Communication Foundation (WCF) är möjligheten att skapa en tjänst som använder ett duplex-meddelandemönster. Det här mönstret gör att en tjänst kan kommunicera med klienten via ett återanrop. Det här avsnittet visar stegen för att skapa en WCF-klient i en klientklass som implementerar motringningsgränssnittet.

En dubbel bindning exponerar IP-adressen för klienten för tjänsten. Klienten bör använda säkerhet för att säkerställa att den endast ansluter till tjänster som den litar på.

En självstudiekurs om hur du skapar en grundläggande WCF-tjänst och -klient finns i Komma igång självstudie.

Så här får du åtkomst till en duplex-tjänst

  1. Skapa en tjänst som innehåller två gränssnitt. Det första gränssnittet är för tjänsten, det andra är för återanropet. Mer information om hur du skapar en duplex-tjänst finns i Så här skapar du ett Duplex-kontrakt.

  2. Kör tjänsten.

  3. Använd verktyget ServiceModel Metadata Utility (Svcutil.exe) för att generera kontrakt (gränssnitt) för klienten. Information om hur du gör detta finns i Så här skapar du en klient.

  4. Implementera motringningsgränssnittet i klientklassen, som du ser i följande exempel.

    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. Skapa en instans av InstanceContext klassen. Konstruktorn kräver en instans av klientklassen.

    InstanceContext site = new InstanceContext(new CallbackHandler());
    
    Dim site As InstanceContext = New InstanceContext(new CallbackHandler())
    
  6. Skapa en instans av WCF-klienten med konstruktorn som kräver ett InstanceContext objekt. Den andra parametern för konstruktorn är namnet på en slutpunkt som finns i konfigurationsfilen.

    CalculatorDuplexClient wcfClient = new CalculatorDuplexClient(site, "default");
    
    Dim wcfClient As New CalculatorDuplexClient(site, "default")
    
  7. Anropa WCF-klientens metoder efter behov.

Exempel

Följande kodexempel visar hur du skapar en klientklass som har åtkomst till ett duplex-kontrakt.

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.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

Se även