Para escenarios de Arquitecturas Distribuidas con Multicast usando WCF 3.5 una opción posible es la siguiente:
[ServiceContract(Namespace = "http://servicios.cliente/2009/06", Name = "IRouter")] public interface IServiceRouter { [OperationContract(ReplyAction = "*", Action = "*")] Message ForwardMessage(Message message); } [ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)] class ServiceRouter : IServiceRouter { #region IRouter Members public Message ForwardMessage(Message message) { Message BogotaServer; Message localServer; MessageBuffer messageBuffer = message.CreateBufferedCopy(int.MaxValue); Message messageCopy = messageBuffer.CreateMessage(); Message messageCopy2 = messageBuffer.CreateMessage(); //Almacenamiento en servidor local finca int headerLocalIndex = message.Headers.FindHeader("Key", "http://serviciosproduccionCP"); if (headerLocalIndex != -1) { string localHost = message.Headers.GetHeader<string>(headerLocalIndex); ChannelFactory<IServiceRouter> client = new ChannelFactory<IServiceRouter>(localHost); localServer = (client.CreateChannel()).ForwardMessage(messageCopy); } else { throw new InvalidOperationException("No se puede encontrar la cabecera 'local'"); } //Almacenamiento en servidor de Bogotá. int headerBogotaIndex = message.Headers.FindHeader("Key", "http://serviciosproduccionBogota"); if (headerBogotaIndex != -1) { string bogotaHost = message.Headers.GetHeader<string>(headerBogotaIndex); ChannelFactory<IServiceRouter> client = new ChannelFactory<IServiceRouter>(bogotaHost); BogotaServer = (client.CreateChannel()).ForwardMessage(messageCopy2); } else { throw new InvalidOperationException("No se puede encontrar la cabecera 'bogota'"); } return BogotaServer; } #endregion }
Este código analiza la información enviada por el cliente y crea una copia del mensaje que es distribuido posteriormente a los servidores que estén registrados en el encabezado del mensaje. Esta técnica de enrutamiento se basa en Contenido, el contenido del header del mensaje SOAP.
Juan Peláez