2010-01-22 4 views
5

У нас есть программа .NET, которая использует WCF для прослушивания связи из другого процесса. Мы использовали именованные каналы.Предотвращение конфликтов имен и имен

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

Код работал отлично, пока не была установлена ​​сторонняя программа .NET. Теперь сбой open с сообщением «Can not listen on pipe name» net.pipe: // localhost/', потому что еще одна конечная точка канала уже прослушивает это имя ».

Мое предположение заключается в том, что другая программа уже использует именованные каналы. Есть ли обходной путь или может только одна программа на компьютере использовать именованные каналы? Я получаю впечатление от других вопросов, что вы можете установить «имя» для трубы, чтобы он не противоречил другим процессам, как вы это делаете?

+0

Может использовать Handle.exe из [SysInternals] (http://technet.microsoft.com/en-us/sysinternals/default.aspx), чтобы узнать, какое приложение использует в настоящее время ваш именованный канал. Команда «Handle.exe net.pipe:». См. Сообщение [Родни Виана] (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

ответ

14

Вы можете использовать несколько именованных каналов за раз. Взгляните на ServiceModelEx от Juval Lowy из своей книги Programming WCF Services. Вы увидите, когда он создает именованные каналы, он использует код, который выглядит примерно так:

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

Который должен избегать конфликтов имен.

+0

Отлично. Большое спасибо – 2010-01-22 15:45:23

+6

Но как клиент знает адрес сервера, если он сгенерирован при запуске? – IneedHelp

+0

Вы можете передать его в качестве параметра клиенту или записать его в реестр или поместить в файл настроек (возможно, временный). – beppe9000

Смежные вопросы