Cómo: Obtener acceso a los servicios con un contrato dúplex
Una característica de Windows Communication Foundation (WCF) es la capacidad de crear un servicio que utilice un patrón de mensajería dúplex. Este patrón permite a un servicio comunicarse con el cliente mediante una devolución de llamada. En este tema se muestran los pasos para crear un cliente de WCF en una clase de cliente que implementa la interfaz de devolución de llamada.
Un enlace dual expone la dirección IP del cliente al servicio. El cliente debería utilizar la seguridad para asegurarse de que solo se conecta a servicios de confianza.
Para obtener un tutorial sobre la creación de un servicio y cliente básico en WCF, vea Tutorial de introducción.
Obtención de acceso a un servicio dúplex
Cree un servicio que contenga dos interfaces. La primera interfaz es para el servicio, la segunda es para la devolución de llamada. Para obtener más información sobre creación de un servicio dúplex, vea Creación de un contrato dúplex.
Ejecute el servicio.
Utilice Herramienta de utilidad de metadatos de ServiceModel (Svcutil.exe) para generar contratos (interfaces) para el cliente. Para obtener más información sobre cómo realizar esta acción, consulte Creación de un cliente de Windows Communication Foundation.
Implemente la interfaz de devolución de llamada en la clase de cliente, tal y como se muestra en el siguiente ejemplo.
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
Cree una instancia de la clase InstanceContext. El constructor necesita una instancia de la clase cliente.
InstanceContext site = new InstanceContext(new CallbackHandler());
Dim site As InstanceContext = New InstanceContext(new CallbackHandler())
Cree una instancia de cliente de WCF mediante el constructor que requiere un objeto InstanceContext. El segundo parámetro del constructor es el nombre de un extremo encontrado en el archivo de configuración.
CalculatorDuplexClient wcfClient = new CalculatorDuplexClient(site, "default")
Dim wcfClient As New CalculatorDuplexClient(site, "default")
Llame a los métodos de cliente de WCF según sea necesario.
Ejemplo
El siguiente ejemplo de código muestra cómo crear una clase de cliente que tenga acceso a un contrato dúplex.
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
Seguridad
Vea también
Tareas
Creación de un contrato dúplex
Creación de un cliente de Windows Communication Foundation
Cómo utilizar ChannelFactory
Conceptos
Herramienta de utilidad de metadatos de ServiceModel (Svcutil.exe)