2012-04-28 1 views
6

Есть две проблемы, с которыми я столкнулся прошлой ночью, которые я разрешил сейчас, но я не уверен на 100%, почему то, что я сделал, разрешило их и надеялось, что кто-то может предложить некоторые как я перевернул много камней и не повезло!Две уникальные именованные трубы, конфликтующие и InvalidCredentialException

Первая проблема

Первый вопрос заключается в том, что у меня было два однозначно именованные каналы, которые находились в двух отдельных программ:

  • net.pipe: // Localhost/superuniquepipe1
  • сеть. pipe: // localhost/superuniquepipe2

Тем не менее, вторая программа для запуска вызовет исключение (I beli накануне это было AddressAlreadyInUseException) при открытии ServiceHost из-за того, что адрес уже используется.

Как я было инстанцирования этих ServiceHosts следующим образом:

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

Так что я бы указать базовый адрес локальных, а затем указать остальное при добавлении конечной точки, пути Я решил это изменить код следующим образом:

this.host = new ServiceHost(this); 
this.host.AddServiceEndpoint(typeof(IHostType), new NetNamedPipeBinding(), "net.pipe://localhost/superuniquepipe2"); 
this.host.Open(); 

Я правильно говорят причина этого работало потому, что он проверял только базовые адреса, а не конечную точку, я пытался добавить? И использует второй пример кода действительный/безопасный способ прослушивания нескольких программ на «localhost»?

Вторая проблема:

В попытке исправить выше, я изменил базовый адрес с локального хоста на ряд различных уникальных строк, например, «net.pipe: // rawrwhyisntthisworkingsadface», но при этом мне будет предъявлено InvalidCredentialException от клиента, пытающегося установить соединение (см. ниже код).

Я был под впечатлением, что именованный канал может буквально быть назвал что-нибудь, может ли кто-нибудь пролить свет на этот?

ChannelFactory<IHostType> factory = new ChannelFactory<IHostType>(new NetNamedPipeBinding(), new EndpointAddress("net.pipe://rawrwhyisntthisworkingsadface/superuniquepipe2")); 
IHostType proxy = factory.CreateChannel(); 
proxy.CallSomeMethodAndGetAnException(); 

Любой входной сигнал был бы весьма признателен, так как я сказал, я решил этот вопрос и просто хочу знать, почему мое решение работает, но если вы видите недостаток в том, как я решить это и может предложить лучше способ сделать это пожалуйста, сделайте это :)

+0

Чтобы расширить это, я получаю ту же проблему, я верю, и это исключение: ** [TYPE]: ** System.ServiceModel.AddressAlreadyInUseException ** [MESSAGE]: ** Не может прослушивать имя pipe 'net.pipe: // localhost /', потому что еще одна конечная точка канала уже прослушивает это имя. – ebol2000

ответ

13

Re проблема 1:

ФОС NetNamedPipeBinding использует именованный общий раздел памяти для публикации своих клиентов реального имени трубы, по которой услуга может быть вызвана. Имя самой трубы - это GUID, генерируемый заново при каждом открытии хоста службы. Это имя раздела разделяемой памяти, используемого для публикации службы, которая зависит от URL-адреса службы. Если базовый адрес определен, базовый адрес используется для получения этого имени.

Это означает, что вы можете использовать только одно приложение-службу WCF в то время, которое использует конкретный базовый адрес для своих конечных точек NetNamedPipe.Если вы попытаетесь запустить второй, он не сгенерируется с помощью AddressAlreadyInUseException, поскольку находит, что имя WCF, которое хочет использовать для местоположения публикации (полученного из базового адреса), уже было принято другим приложением.

Если вы не указали базовый адрес и предоставили каждой службе абсолютный уникальный URL-адрес службы, то теперь имя местоположения публикации будет получено из полного абсолютного URL-адреса, и между приложениями не будет столкновений имен. Это полностью эффективный и безопасный способ прослушивания нескольких служб WCF с именем pipe.

проблема Re 2:

На стороне обслуживания вы можете использовать что-нибудь для имени хоста части URL службы. Это связано с параметром HostNameComparisonMode, применяемым по умолчанию в NetNamePipeBinding, поскольку алгоритм в WCF, который получает имя для места публикации разделяемой памяти, заменяет подстановочный знак для имени хоста see here, чтобы включить настроенный режим сопоставления имени хоста.

На стороне клиента, однако, URL-адрес службы ограничен: хост-часть должна действительно разрешить локальный хост (то есть это localhost, правильный IP-адрес или правильное имя машины).

+0

Спасибо за всю информацию, очень ценю :) – rastating

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

  • Нет связанных вопросов^_^