Estamos haciendo unos cambios en una de nuestras aplicaciones para que funcione relativamente bien en entornos de alta disponibilidad, uno de los cambios es que los Servicios Win32, que no pueden estar activos a la vez en varios servidores, se comuniquen entre ellos de manera que siempre uno, pero solo uno de la “granja” este activo.
Para eso hemos usado comunicación TCP con WCF, cada Servicio Win32 es servidor y cliente a la vez, de esa manera se comunican en forma de árbol para saber si tienen que activarse o no.
En este Post no me enrollare con todo el sistema solo sobre como hostear un servicio WCF en un Servicio Win32 y como crear un cliente para consumirlo.
Podemos añadir el servicio al proyecto con el témplate o añadirlo a mano, en realidad solo se trata de una clase, un interface y una nueva sección en el app.config
En el interface definimos el servicio y los métodos:
namespace Service { [ServiceContract] public interface IMyTcpServer { [OperationContract] bool Ping(); } }
La clase debe implementar el interface y es donde pondremos el código:
namespace Service { public class MyTcpServer : IMyTcpServer { public bool Ping() { return true; } } }
La sección del app.config donde definiremos que tipo de comunicación queremos, la dirección, el puerto, etc., en este caso comunicación tcp en el puerto 8731
<services> <service behaviorConfiguration="Service.MyTcpServerBehavior" name="Service.MyTcpServer"> <endpoint address="" binding="netTcpBinding" contract="Service.IMyTcpServer"> <identity> <dns value="localhost" /> </identity> </endpoint> <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" /> <host> <baseAddresses> <add baseAddress="net.tcp://localhost:8731/Service/MyTcpServer/" /> </baseAddresses> </host> </service> </services>
Ya tenemos el servicio configurado, solo nos queda poner código en el OnStart del servicio Win32 para arrancarlo, el código es el siguiente:
ServiceHost tcpHostServer = new ServiceHost(typeof(MyTcpServer)); tcpHostServer.Open();
Ya tenemos nuestro servicio Win32 con su método de ping para poder comprobar si esta funcionando o no.
La parte cliente es realmente sencilla, ya que añadimos una Referencia de Servicio, como hacíamos antes con una referencia web, y el IDE nos crea todo el código necesario para consumir el servicio, la única diferencia es que el cliente no tiene una propiedad para indicarle la dirección del servicio, para indicarle una dirección distinta a la que crea en app.config cuando añadimos la referencia hay que hacerlo de la siguiente manera:
NetTcpBinding netTcpBinding = new NetTcpBinding(); EndpointAddress endpointAddress = new EndpointAddress("net.tcp://direccion:elPuerto/ElServicio/"); using (MyTcpServerClient client = new MyTcpServerClient(netTcpBinding, endpointAddress)) { return client.Ping(); }
Y listo![]()


