Me he encontrado con un problema. Soy un poco nuevo en WCF por lo que cualquier ayuda sería muy apreciada.WCF: Net.TCP enlaces múltiples, mismo puerto, diferentes direcciones IP
Aquí está mi código:
public static void StartHosts()
{
try
{
// Create a new host
ServiceHost host = new ServiceHost(typeof(ServerTasks));
List<IPAddress> ips = new List<IPAddress>(Dns.GetHostAddresses(Dns.GetHostName()));
if (IPAddress.Loopback != null)
ips.Add(IPAddress.Loopback);
ips.RemoveAll(i => i.AddressFamily != AddressFamily.InterNetwork);
foreach (var ip in ips)
{
string uri = string.Empty;
// Formulate the uri for this host
uri = string.Format(
"net.tcp://{0}:{1}/ServerTasks",
ip.ToString(),
ServerSettings.Instance.TCPListeningPort
);
// Add the endpoint binding
host.AddServiceEndpoint(
typeof(ServerTasks),
new NetTcpBinding(SecurityMode.Transport) { TransferMode = TransferMode.Streamed },
uri
);
}
// Add the meta data publishing
var smb = host.Description.Behaviors.Find<ServiceMetadataBehavior>();
if (smb == null)
smb = new ServiceMetadataBehavior();
smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
host.Description.Behaviors.Add(smb);
host.AddServiceEndpoint(
ServiceMetadataBehavior.MexContractName,
MetadataExchangeBindings.CreateMexTcpBinding(),
"net.tcp://localhost/ServerTasks/mex"
);
// Run the host
host.Open();
}
catch (Exception exc)
{
DebugLogger.WriteException(exc);
}
}
se produce una excepción en la línea: 'host.Open();'
La excepción es:
System.InvalidOperationException Un registro ya existe para URI 'net.tcp: //192.168.1.45: 4329/ServerTasks'.
Lo que estoy tratando de hacer es enlazar a todas las direcciones de red en la máquina para que las aplicaciones cliente puedan llegar al servicio desde cualquier red en la que lo vean. Cuando ejecuto este código, encuentra e intenta configurar un enlace para aproximadamente 5 IP diferentes, incluyendo 127.0.0.1.
192.168.1.45 es la segunda dirección IP a la que intenta vincularse. En el momento en que arroja la excepción, puedo ver (usando netstat) que el programa se ha vinculado a la primera IP de la lista en el puerto 4329. No hay nada vinculado al puerto 4329 en la dirección mencionada en la excepción.
Lo siento, no hay muchos detalles, quería dar una publicación concisa. Si alguien necesita más información, me complacerá proporcionarla.
Nota: He intentado configurar PortSharingEnabled en true para el NetTcpBinding que se crea dentro del bucle foreach, pero igual experimenté el mismo error.
¡Cualquier ayuda o consejo sería muy apreciado!
Gracias
Enlazar a cada dirección IP individualmente es lo correcto porque de lo contrario su servidor tiene un agujero de seguridad - imagine (improbable) una situación en la que otro servicio se vincule a una dirección IP particular y el mismo puerto mientras su servicio está vinculado a TODAS las direcciones IP . En este caso, imposter obtendrá todas las solicitudes de conexión de los clientes que lleguen a esta dirección IP. – AlexT