WS-Discovery (II):Novedades en WCF 4.0
En el post anterior empezamos a ver la especificación de WS-Discovery por medio de los mensajes PROBE y PROBE MATCH. A lo largo de esta entrada trataremos de ver los anunciós HELLO y BYE y como hacer que nuestros servicios los realicen de forma automática cada vez que los mismos se abren o cierran los canales de escucha.
Si para el descubrimiento de los servicios a los extremos de nuestro servicio agregábamos un elemento de tipo udpDiscoveryEndpoint para facilitar su descubrimiento junto al comportamiento discoveryBehavior. Para los anuncios solamente tendremos que incluir un nuevo extremo, udpAnnouncementEndpoint, esta vez, dentro de la sección de anuncios del comportamiento discoveryBehavior tal y como se muestra a continuación.
<behaviors>
<serviceBehaviors>
<behavior name="SampleServiceBehavior">
<serviceDiscovery>
<announcementEndpoints>
<endpoint name="udpAnnouncementEndpoint" kind="udpAnnouncementEndpoint"
endpointConfiguration="" />
</announcementEndpoints>
</serviceDiscovery>
</behavior>
</serviceBehaviors>
</behaviors>
Con este sencillo paso, automáticamente nuestro servicio es capaz de realizar los envíos de los anuncios. La pregunta que os estaréis haciendo ahora es ¿Cómo se subscribe uno a estos anuncios? En definitiva, estos anuncios no son más que mensajes enviados a una dirección de multicast, ya comentada en el artículo anterior, que un determinado servicios puede estar escuchando. La implementación de este servicio de escucha es muy sencilla basándose en una clase ya incluída en WCF 4.0 que se llama AnnouncementService y cuyo ejemplo de uso podemos ver a continuación.
static void Main(string[] args)
{
AnnouncementService announcementService = new AnnouncementService();
announcementService.OfflineAnnouncementReceived += new EventHandler<AnnouncementEventArgs>(announcementService_OfflineAnnouncementReceived);
announcementService.OnlineAnnouncementReceived += new EventHandler<AnnouncementEventArgs>(announcementService_OnlineAnnouncementReceived);
using (ServiceHost host = new ServiceHost(announcementService))
{
host.AddServiceEndpoint(new UdpAnnouncementEndpoint());
host.Open();
Console.ReadLine();
}
}
static void announcementService_OnlineAnnouncementReceived(object sender, AnnouncementEventArgs e)
{
Console.WriteLine("El servicio {0} anuncia HELLO",e.AnnouncementMessage.EndpointDiscoveryMetadata.Address);
}
static void announcementService_OfflineAnnouncementReceived(object sender, AnnouncementEventArgs e)
{
Console.WriteLine("El servicio {0} anuncia BYE",e.AnnouncementMessage.EndpointDiscoveryMetadata.Address);
}