2010-01-22 11 views
5

Tenemos un programa .NET que utiliza WCF para escuchar la comunicación de otro proceso. Usamos tubos con nombre.Prevenir el conflicto de tuberías con nombre

ServiceHost host = new ServiceHost(
    typeof(Something), 
    new Uri[] 
    { 
     new Uri("net.pipe://localhost") 
    }); 
host.AddServiceEndpoint(typeof(ISomething), new NetNamedPipeBinding(), "Something"); 
host.Open(); 

El código funcionó muy bien hasta que se instaló un programa .NET de terceros. Ahora la apertura falla con un mensaje de "No se puede escuchar el nombre de la tubería 'net.pipe: // localhost /' porque otro extremo de la tubería ya está escuchando ese nombre."

Mi hipótesis es que el otro programa ya está utilizando canalizaciones con nombre. ¿Hay alguna solución alternativa o solo un programa en una computadora puede usar conductos con nombre? Me da la impresión de que puede establecer un "nombre" para una tubería para que no entre en conflicto con otros procesos. ¿Cómo lo hace?

+0

Puede usar Handle.exe desde [SysInternals] (http://technet.microsoft.com/en-us/sysinternals/default.aspx) para averiguar qué aplicación está utilizando actualmente utilizando su canalización con nombre. Comando "Handle.exe net.pipe:". Ver [publicación de Rodney Viana] (http://blogs.msdn.com/b/rodneyviana/archive/2011/03/22/named-pipes-in-wcf-are-named-but-not-by-you-and -how-to-find-the-real-windows-object-name.aspx) – mcdon

Respuesta

14

Puede usar varias tuberías nombradas a la vez. Eche un vistazo al ServiceModelEx de Juval Lowy de su libro Programming WCF Services. Verá cuando crea canalizaciones con nombre, utiliza el código que se ve algo como:

Uri baseAddress = new Uri("net.pipe://localhost/" + Guid.NewGuid().ToString());

¿Qué deben evitar los conflictos de nombres.

+0

Perfecto. Muchas gracias –

+6

Pero, ¿cómo sabe el cliente la dirección del servidor si se genera en la ejecución? – IneedHelp

+0

Puede pasarlo como un parámetro para el cliente o escribirlo en el registro o ponerlo en un archivo de configuración (quizás temporal). – beppe9000

Cuestiones relacionadas