viernes, 28 de diciembre de 2012

WSDualHttpBinding - Ejemplo sobre como usar WCF Dúplex (cliente)

Hoy nos disponemos a crear un cliente "Dúplex" para el servicio que creamos la semana pasada. El objetivo es suscribirnos al servicio de notificaciones al lanzar la aplicación, de este modo el servidor guardará nuestra referencia

CallBack

que usará cuando se produzca un evento que nos afecta para enviarnos las novedades. En resumen tenemos que seguir los siguientes pasos en este orden:

  • Crear un servicio alojado en cliente que implemente el contrato

    CallBack

    que tenemos en AreaTicShared para que el servidor pueda enviarnos las novedades cuando considere oportuno.

  • Crear un cliente

    WCF

    para podernos suscribir a las novedades al cual asociaremos nuestro

    CallBack

    .

Veamos como hacerlo:

En primer lugar para situarnos estamos trabajando en la solución AreaTicClient, es importante incluir la referencia del proyecto AreaTicShared que creamos la semana pasada. Para crear el servicio

CallBack

hemos de implementar la interfaz "AreaTicShared.Duplex.IServerNotificationsCallBack".
namespace AreaTicClient.Duplex
{
    public class ServiceNotificationsCallBack:IServerNotificationsCallBack
    {
        public void RecibeNotificaciones(List<Notification> pListaNotificaciones)
        {
            //Gestionar la lista que nos devuelve el servidor, mostrando la información por pantalla o haciendo lo que nos apetezca con la notificación. 
        }
    }
}
A continuación veremos como crear el cliente

WCF Duplex

, este bloque de código se encarga de crear un cliente que apunte al servicio Dúplex que definimos la semana pasada en servidor y lo asocia al

CallBack

que hemos definido en el paso anterior. Hemos de ubicar este código en algún punto que se ejecute cada vez que se arranque la aplicación cliente.
  ServiceNotificationsCallBack CallBack = new ServiceNotificationsCallBack();

  WSDualHttpBinding binding = new WSDualHttpBinding();

  binding.ClientBaseAddress = new Uri("http://IPCliente:2100/CallBack");
  
  DuplexChannelFactory<IServerNotifications> cf = new   DuplexChannelFactory<IServerNotifications>(CallBack, binding, new EndpointAddress("http://URLServidor:2100"));

  IServerNotifications wcfClient = cf.CreateChannel();

  wcfClient.SubscripcionListaNovedades(MiIDdeCliente);
En la propiedad

ClientBaseAddress

del binding hemos de asignar la dirección de respuesta del CallBack. Tanto el ejemplo servidor como cliente usa el puerto 2100 para comunicar pero podríamos usar cualquier otro, simplemente hemos de asegurarnos que la comunicación HTTP está habilitada entre las máquinas por ese puerto.

Nota: Asumo que cada cliente tendrá una dirección IP diferente, en caso que la aplicación cliente esté corriendo en algún TS o Citrix y se pueda dar el caso que varios clientes ejecuten simultáneamente la aplicación cliente compartiendo IP tendríamos que hacer que la URL del callback sea única para cada cliente... Se podría concatenar algún tipo de GUID o identificador único a la URL cliente para evitar este problema.

Con esto ya tendríamos la base de la comunicación Duplex que podríais adaptar cada uno a vuestro escenario. Espero os sirva no dudéis en comentar dudas o cualquier anotación que se os ocurra sobre el tema!! Recordar como siempre que podéis seguir

areaTIC

en las redes sociales o RSS, esperamos tu participación!


No hay comentarios:

Publicar un comentario en la entrada