Поделиться через


Практическое руководство. Доступ к службам с дуплексным контрактом

Одной из особенностей Windows Communication Foundation (WCF) является возможность создать службу, использующую дуплексный шаблон обмена сообщениями. Такой шаблон позволяет службе взаимодействовать с клиентом с помощью обратного вызова. В этом разделе приведены основные этапы создания клиента WCF в классе клиента, который реализует интерфейс обратного вызова.

Двойная привязка предоставляет службе IP-адрес клиента. Клиент должен использовать механизм безопасности, чтобы обеспечить подключение только к доверенным службам.

Инструкции по созданию простой службы и клиента WCF см. в разделе Учебник по началу работы.

Доступ к дуплексной службе

  1. Создайте службу, содержащую два интерфейса. Первый интерфейс предназначен для службы, второй — для обратного вызова. Дополнительные сведения о создании дуплексной службы см. в разделе Как создавать дуплексный контракт.

  2. Запустите службу.

  3. С помощью Служебное средство ServiceModel Metadata Utility Tool (Svcutil.exe) создайте контракты (интерфейсы) для клиента. Сведения о том, как это сделать, см. в разделе Как создать клиент Windows Communication Foundation.

  4. Реализуйте в классе клиента интерфейс обратного вызова, как показано в следующем примере.

    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. Создайте экземпляр класса InstanceContext. Конструктору требуется экземпляр класса клиента.

    InstanceContext site = new InstanceContext(new CallbackHandler());
    
    Dim site As InstanceContext = New InstanceContext(new CallbackHandler())
    
  6. Создайте экземпляр клиента WCF, используя конструктор, которому требуется объект InstanceContext. Вторым параметром конструктора является имя конечной точки, определенное в файле конфигурации.

    CalculatorDuplexClient wcfClient = 
    new CalculatorDuplexClient(site, "default")
    
    Dim wcfClient As New CalculatorDuplexClient(site, "default")
    
  7. Вызовите требуемые методы клиента WCF.

Пример

В следующем примере кода показано, как создать класс клиента, обращающийся к дуплексному контракту.

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

Безопасность

См. также

Задачи

Как создавать дуплексный контракт
Как создать клиент Windows Communication Foundation
Как использовать ChannelFactory

Основные понятия

Служебное средство ServiceModel Metadata Utility Tool (Svcutil.exe)

Другие ресурсы

Учебник по началу работы