2010-01-22 2 views
5

Abbiamo un programma .NET che utilizza WCF per ascoltare la comunicazione da un altro processo. Abbiamo usato pipe con nome.Prevenire il conflitto di pipe con nome

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

Il codice ha funzionato benissimo finché non è stato installato un programma .NET di terze parti. Ora l'open fallisce con un messaggio di "Can not listen on pipe name" net.pipe: // localhost/'perché un altro endpoint di pipe è già in ascolto su quel nome. "

La mia ipotesi è che l'altro programma stia già utilizzando pipe denominate. C'è una soluzione alternativa o solo un programma su un computer utilizza pipe denominate? Prendo l'impressione da altre domande che puoi impostare un "nome" per una pipe in modo che non entri in conflitto con altri processi, come puoi farlo?

+0

È possibile utilizzare Handle.exe da [SysInternals] (http://technet.microsoft.com/en-us/sysinternals/default.aspx) per scoprire quale applicazione sta utilizzando attualmente la pipa denominata. Comando "Handle.exe net.pipe:". Vedi [il post di 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-actual-windows-object-name.aspx) – mcdon

risposta

14

È possibile utilizzare più pipe denominate alla volta. Dai un'occhiata a ServiceModelEx di Juval Lowy dal suo libro Programming WCF Services. Vedrai quando crea pipe denominate, usa un codice che assomiglia a qualcosa:

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

Che dovrebbe evitare conflitti di nome.

+0

Perfetto. Grazie mille –

+6

Ma come fa il client a conoscere l'indirizzo del server se è generato in esecuzione? – IneedHelp

+0

È possibile passarlo come parametro al client o scriverlo nel registro o inserirlo in un file di impostazioni (forse temporaneo). – beppe9000