Я пишу службу Windows с сопроводительным "средством определения состояния". Служба содержит WCF с именем pipe endpoint для межпроцессного взаимодействия. Через именованный канал инструмент состояния может периодически запрашивать службу для последнего "статуса".
На моей машине разработки у меня есть несколько IP-адресов; одна из них - "локальная" сеть с адресом 192.168.1.XX. Другая - "корпоративная" сеть с адресом 10.0.X.XX. Служба Windows собирает многоадресный трафик UDP на одном IP-адресе.
Служба Windows до сих пор работала нормально, пока она использует адрес 192.168.1.XX. Он последовательно сообщает статус правильному клиенту.
Как только я переключился на другой, "корпоративный" IP-адрес (10.0.X.XX) и перезапустил службу, я получаю непрерывные "CommunicationExceptions" при получении статуса:
"There was an error reading from the pipe: The pipe has been ended. (109, 0x6d)."
Теперь я не думаю, что IP-адрес UDP-клиента должен был иметь какое-либо отношение к функциональности интерфейса Named-Pipe; они являются полностью отдельными частями приложения!
Вот соответствующие разделы конфигурации WCF:
//On the Client app:
string myNamedPipe = "net.pipe://127.0.0.1/MyNamedPipe";
ChannelFactory<IMyService> proxyFactory =
new ChannelFactory<IMyService>(
new NetNamedPipeBinding(),
new EndpointAddress(myNamedPipe));
//On the Windows Service:
string myNamedPipe = "net.pipe://127.0.0.1/MyNamedPipe";
myService = new MyService(myCustomArgs);
serviceContractHost = new ServiceHost(myService );
serviceContractHost.AddServiceEndpoint(
typeof(IMyService),
new NetNamedPipeBinding(),
myNamedPipe);
serviceContractHost.Open();
Я бы не подумал, что это проблема с правами доступа - я запускаю клиент с правами администратора, но, возможно, существует какая-то причина в домене?