Servicios dúplex
Un contrato de servicios dúplex es un modelo de intercambio de mensajes en el que ambos extremos pueden enviar mensajes al otro de manera independiente. Un servicio dúplex, por tanto, puede enviar mensajes de vuelta al extremo del cliente, proporcionando un comportamiento parecido a los eventos. La comunicación dúplex se produce cuando un cliente se conecta a un servicio y proporciona al servicio un canal en el que el servicio puede devolver los mensajes al cliente. Tenga en cuenta que el comportamiento como evento de los servicios dúplex sólo funciona dentro de una sesión.
Para crear un contrato dúplex ha de crear un par de interfaces. La primera es la interfaz del contrato de servicio, que describe las operaciones que un cliente puede invocar. Ese contrato de servicios debe especificar un contrato de devolución de llamadas en la propiedad System.ServiceModel.ServiceContractAttribute.CallbackContract. El contrato de devolución de llamadas es la interfaz que define las operaciones a las que el servicio puede llamar en el extremo del cliente. Un contrato dúplex no requiere una sesión, aunque los enlaces dúplex proporcionados por el sistema las utilizan.
A continuación, se muestra un ejemplo de un contrato dúplex.
La clase CalculatorService
implementa la interfaz principal ICalculatorDuplex
. El servicio utiliza el modo de instancia PerSession para mantener el resultado para cada sesión. Una propiedad privada denominada Callback
tiene acceso al canal de devolución de llamadas hasta el cliente. El servicio utiliza la devolución de llamadas para devolver los mensajes al cliente a través de la interfaz de devolución de llamadas, como se muestra en el siguiente código de muestra.
El cliente debe proporcionar una clase que implemente la interfaz de devolución de llamadas del contrato dúplex para recibir los mensajes del servicio. En el siguiente ejemplo de código se muestra una clase CallbackHandler
que implementa la interfaz ICalculatorDuplexCallback
.
El cliente WCF que se genera para un contrato dúplex requiere que se proporcione una clase InstanceContext en la construcción. Esta clase InstanceContext se utiliza como sitio para un objeto que implementa la interfaz de devolución de llamadas y administra mensajes que se devuelven desde el servicio. Se construye una clase InstanceContext con una instancia de la clase CallbackHandler
. Este objeto administra mensajes enviados desde el servicio al cliente en la interfaz de devolución de llamadas.
La configuración del servicio debe realizarse para proporcionar un enlace que admita comunicación de la sesión y dúplex. El elemento wsDualHttpBinding admite la comunicación de la sesión y permite la comunicación dúplex proporcionando conexiones HTTP duales, una para cada dirección.
En el cliente, debe configurar una dirección que el servidor pueda utilizar para conectarse al cliente, como se muestra en la configuración del ejemplo siguiente.
Nota
Además, los clientes que no sean dúplex y que no se autentiquen mediante una conversación segura, normalmente, producen una MessageSecurityException. Sin embargo, si un cliente dúplex que utiliza una conversación segura no se autentica, el cliente recibe una TimeoutException.
Si crea un cliente/servicio mediante el elemento WSHttpBinding y no incluye el extremo de devolución de llamada de cliente, recibirá el siguiente error.
HTTP could not register URL
htp://+:80/Temporary_Listen_Addresses/<guid> because TCP port 80 is being used by another application.
El siguiente ejemplo de código muestra cómo especificar la dirección de extremo de cliente mediante código.
WSDualHttpBinding binding = new WSDualHttpBinding();
EndpointAddress endptadr = new EndpointAddress("https://localhost:12000/DuplexTestUsingCode/Server");
binding.ClientBaseAddress = new Uri("https://localhost:8000/DuplexTestUsingCode/Client/");
El siguiente ejemplo de código muestra cómo especificar la dirección de extremo de cliente mediante configuración.
<client>
<endpoint name ="ServerEndpoint"
address="https://localhost:12000/DuplexTestUsingConfig/Server"
bindingConfiguration="WSDualHttpBinding_IDuplexTest"
binding="wsDualHttpBinding"
contract="IDuplexTest" />
</client>
<bindings>
<wsDualHttpBinding>
<binding name="WSDualHttpBinding_IDuplexTest"
clientBaseAddress="https://localhost:8000/myClient/" >
<security mode="None"/>
</binding>
</wsDualHttpBinding>
</bindings>
Consulte también
Tareas
Cómo: Crear un generador de canales y utilizarlo para crear y gestionar canales
Conceptos
Especificación del comportamiento de tiempo de ejecución del cliente