2010-01-22 6 views
5

Nous avons un programme .NET qui utilise WCF pour écouter la communication d'un autre processus. Nous avons utilisé des tuyaux nommés.Empêcher le conflit de canaux nommés

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

Le code a bien fonctionné jusqu'à l'installation d'un programme .NET tiers. Maintenant, l'ouverture échoue avec un message de "Impossible d'écouter le nom de pipe 'net.pipe: // localhost /' car un autre point de terminaison de canal écoute déjà sur ce nom."

Mon hypothèse est que l'autre programme utilise déjà des canaux nommés. Existe-t-il une solution de contournement ou un seul programme sur un ordinateur peut-il utiliser des canaux nommés? J'ai l'impression à partir d'autres questions que vous pouvez définir un "nom" pour un tuyau afin qu'il ne soit pas en conflit avec d'autres processus, comment faites-vous cela?

+0

Vous pouvez utiliser Handle.exe de [SysInternals] (http://technet.microsoft.com/en-us/sysinternals/default.aspx) pour savoir quelle application utilise actuellement votre canal nommé. Commande "Handle.exe net.pipe:". Voir [le message 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-nom-de-l'objet.aspx) – mcdon

Répondre

14

Vous pouvez utiliser plusieurs canaux nommés à la fois. Jetez un oeil à ServiceModelEx de Juval Lowy à partir de son livre Programming WCF Services. Vous verrez quand il crée des pipes nommés, il utilise le code qui ressemble à:

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

qui devrait éviter les conflits de noms.

+0

Parfait. Merci beaucoup –

+6

Mais comment le client connaît-il l'adresse du serveur s'il est généré en cours de route? – IneedHelp

+0

Vous pouvez le passer en paramètre au client ou l'écrire dans le registre ou le placer dans un fichier de paramètres (peut-être temporaire). – beppe9000

Questions connexes