Трассировка стека показывает, что на стеке клиентского канала WCF произошла ошибка при попытке извлечь из URL-адреса службы фактическое имя именованного канала, используемого службой. Служба публикует имя канала (который представляет собой GUID, который изменяется при каждом перезапуске службы), помещая небольшую структуру в именованный раздел совместно используемой памяти , который содержит GUID в качестве одного из своих полей. Имя, используемое для раздела с общей памятью, получено из URL-адреса службы путем применения алгоритма, который компилируется в код WCF на стороне сервера и на стороне клиента для NetNamedPipeBinding.
Исключение, о котором сообщалось в вопросе, действительно означает, что после применения алгоритма к URL-адресу службы для получения имени клиентский код не смог открыть дескриптор раздела с общей памятью этого имени. Это может означать, как говорится в сообщении об исключении, что служба не прослушивает URL-адрес службы, используемый для получения имени. Но вместо этого это может означать, что раздел памяти существует, как и служба, но код на стороне клиента не выполняется в контексте безопасности, который позволяет ему получить доступ к общей памяти.
На платформах Windows до Vista весьма маловероятно, что клиенту WCF когда-либо не хватало бы разрешений безопасности для открытия общей памяти, считывания с нее идентификатора GUID канала и успешного подключения к каналу службы. Но на Vista и более поздних платформах есть новые механизмы безопасности, которые делают этот сценарий гораздо более распространенным сбоем.
Vista представила концепцию различных пространств имен для именованных объектов ядра: для каждого сеанса входа в систему существует глобальное (общесистемное) пространство имен и личное пространство имен. Клиентский код NetNamedPipeBinding будет пытаться использовать оба пространства имен при поиске раздела общей памяти, в котором объявлено имя канала. Если сервер создал общую память, используя глобальное имя, или если служба и клиент работают в одном сеансе входа в систему, клиент найдет то, что ищет. Однако, если сервис не может создать объект в глобальном пространстве имен (он всегда пытается это сделать первым), то он обратится к созданию в нем пространства имен частного сеанса, и тогда только клиенты, работающие в одном сеансе, смогут видеть Это. Создание объектов ядра глобального пространства имен требует специальных привилегий в Vista и более поздних платформах, которые обычно имеют только процессы и приложения Windows Service, работающие под именем «Администратор». Распространенной ошибкой является попытка создать клиент в службе Windows, пытающийся подключиться к службе WCF NetNamedPipe, размещенной в приложении, запущенном в интерактивном сеансе пользователя.
Механизм обязательной целостности Vista также может предотвращать подключение предполагаемого клиента к службе WCF NetNamedPipeBinding, если код клиента выполняется в контексте более низкой целостности (например, плагин браузера), чем код, на котором размещается служба.
Я полагаю, что описанные в этом вопросе симптомы, когда тестовые клиенты работают, но реальные клиенты не работают, почти наверняка вызваны тем, что контекст безопасности реальных клиентов несовместим с контекстом хоста службы для одного или другого из эти причины.