WS-Discovery (I): Novedades en WCF 4.0

NOTA: En esta entrada solamente se tratará el modo AdHoc, es decir, basándose en descubrimiento de servicios bajo una misma subred. Se deja para otros futuros post la creación de un proxy de descubrimiento.

WS-Discovery es una de las ‘pocas’ novedades que trae WCF 4.0, es decir, la versión de Windows Communication Foundation en Visual Studio 2010. Aunque es ya un estandard de OASIS  que tiene su tiempo, hasta esta nueva versión no teníamos implementación directa.

Antes de empezar a mostrar ejemplos sobre su uso en Visual Studio 2010 haremos un breve repaso del porqué y cómo funciona WS-Discovery. La idea es muy simple, y se basa en el descubrimiento automático de extremos de servicio dentro de una red, algo muy demandado y necesario en Bus de Servicios Empresariales ( ESB ), dónde el direccionamiento puede modificarse con relativa frecuencia. La especificación de este estándar es relativamente pequeña y fácil de entender tal y como se puede ver resumida en los siguientes puntos.

· Cuando un servicio se une a una red, es decir, cuando se pone a escuchar en una determinada dirección este envía un anuncio denominado HELLO para notificar su entrada a la misma.

· Cuando un servicio se quita de una red, es decir, cuando se cierra y deja de escuchar en una dirección este envía un anuncio denominado BYE para notificar su salida.

· Un cliente puede descubrir servicios existentes en un red bajo un criterio determinado enviando un mensaje denominado PROBE, si existe algún servicio este responde con otro mensaje denominado PROBE MATCH el cual contiene la información de su ServiceEndPoint.

· Un cliente puede descubrir servicios existentes en la red mediante su nombre, para ello puede enviar un mensaje denominado RESOLVE, si el servicio está en la red responde con otro mensaje denominado RESOLVE MATCH con la información del mismo.

Sencillo verdad? Le suena esté mecanismo? En realidad es el mismo que Windows utiliza para el descubrimiento de dispositivos hardware puesto que también se basa en una implementación de WS Discovery.

Sobre este pequeño resumen de especificación caben unas cuantas preguntas, la primera es ¿dónde se envían estos mensajes y/o anuncios? La respuesta es mediante multicast a una dirección determinada, que por regla general y en el caso de WCF 4.0 es soap.udp://239.255.255.250:3702, valores que podremos modificar dentro de la nueva sección de configuración “Standard Endpoints” que WCF Configuration Editor pone a nuestra disposición. Al final, como podrá comprobar, WS-Discovery no es más que la implementación de un determinado contrato de servicio, que en caso de WCF 4.0 se corresponde con la versión de Abril 2005 y que tiene la siguiente firma.

Ahora que más o menos entendemos WS-Discovery, veámos como configurar un servicio para que acepte la petición Probe y por lo tanto pueda ser descubierto por los clientes del mismo ( entendiéndose como clientes también a otros servicios).

El primer paso es agregar a nuestros servicios un Endpoint especial, llamado updDiscoveryEndpoint, de forma similar a como agregamos extremos de servicio hasta la fecha.

 

NOTA: El atributo Kind es nuevo dentro de la configuración de Windows Communication Foundation y nos permite especificar que este extremo se corresponde con alguno de los extremos ‘estándar’ que tenemos configurados. Algunos ejemplos adicionales de estos extremos son timerServiceNotificationExpiredEndpoint,timerServiceEndpoint o announcementEndpoint.

Una vez que hemos agregado nuestro nuevo extremo al servicio solamente tendremos que agregar al mismo un nuevo comportamiento, denominado ServiceDiscovery.

 

Con estos dos sencillos pasos nuestro servicio ya será capaz de aceptar mensajes de tipo PROBE y responder con la información de los extremos en los que está escuchando.

NOTA: El documento de especificación de WS-Discovery contiene una completa documentación acerca de los formatos de mensajes PROBE y PROBE MATCH que le recomiendo revisar.

 

Llegados a este momento en el que ya tenemos configurado nuestro servicio para aceptar peticiones PROBE veremos cómo obtener y/o descubrir la información de los mismos de forma AdHoc. Para ello nos serviremos de la clase DiscoveryClient situada en el espacio de nombres System.ServiceModel.Discovery, tal y como vemos en el siguiente ejemplo de código:

 

 

 

Fíjese que en la especificación de la clase FindCriteria podemos establecer el contrato que los servicios que queremos buscar tienen que cumplir. Como elementos adicionales, FindCriteria también nos permite establecer un máximo de duración en la búsqueda o los Scopes de servicio que se tienen que cumplir.

Un comentario sobre “WS-Discovery (I): Novedades en WCF 4.0”

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *