Есть две проблемы, с которыми я столкнулся прошлой ночью, которые я разрешил сейчас, но я не уверен на 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();
Любой входной сигнал был бы весьма признателен, так как я сказал, я решил этот вопрос и просто хочу знать, почему мое решение работает, но если вы видите недостаток в том, как я решить это и может предложить лучше способ сделать это пожалуйста, сделайте это :)
Чтобы расширить это, я получаю ту же проблему, я верю, и это исключение: ** [TYPE]: ** System.ServiceModel.AddressAlreadyInUseException ** [MESSAGE]: ** Не может прослушивать имя pipe 'net.pipe: // localhost /', потому что еще одна конечная точка канала уже прослушивает это имя. – ebol2000