Multicast with WCF 3.5
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
3Metas Corp.