Мне не удалось открыть именованный канал на предварительном промежуточном хосте Windows Server 2008 R2, и все же у меня не было никаких проблем с разработкой этого кода на хосте разработки WS 2008 R2 (который должен быть настроен идентично) и тестирование работы этого канала .
Приложение имеет веб-службу WCF RESTful в IIS, которая подключается к службе Windows через именованный канал. Затем служба Windows запрашивает базу данных Oracle с помощью сценария Perl. Но на хосте предварительной подготовки мы никогда не заходим так далеко, потому что канал не открывается.
Первой проблемой было нарушение прав доступа. Когда я вылечил это с помощью экземпляра PipeSecurity, я получил исключение об отсутствующем дескрипторе. Я все работаю как администратор на обоих хостах. Я открыл доступ ко всем связанным папкам на тестовом хосте (да, я защищу его снова, как только он заработает). журналы IIS не показывают ничего необычного в службе WCF.
Вот код с хоста разработки, который работал «из коробки» без проблем.
ClientPipe = new NamedPipeClientStream(
".", "QueryPipe", PipeDirection.InOut, PipeOptions.None,
TokenImpersonationLevel.None);
ClientPipe.Connect();
Просто и прямолинейно.
Вот код с промежуточного хоста, с которым я бесконечно возился, чтобы попытаться заставить его работать.
ClientPipe =
new NamedPipeClientStream(".", "QueryPipe",
PipeAccessRights.FullControl,
PipeOptions.None,
TokenImpersonationLevel.None,
HandleInheritability.None);
PipeSecurity _ps = new PipeSecurity();
_ps.AddAccessRule(new PipeAccessRule(
WindowsIdentity.GetCurrent().User,
PipeAccessRights.FullControl, AccessControlType.Allow));
_ ps.AddAccessRule(new PipeAccessRule(
"SYSTEM", PipeAccessRights.FullControl, AccessControlType.Allow));
ClientPipe.SetAccessControl(_ps);
ClientPipe.Connect();
Использование класса PipeSecurity решило первоначальную проблему с правами доступа (благодаря ответу Криса Диксона 2010 года о настройке доступа к каналу).
Но после установки контроля доступа я получаю это исключение:
** Pipe Error: System.InvalidOperationException:
Pipe handle has not been set.
Did your PipeStream implementation call InitializeHandle?
Я гуглил до посинения кончиков пальцев, но не получил полезного ответа. Кажется, я уже должен был установить дескриптор, просто используя конструктор. InitializeHandle не должен применяться здесь.
Итак, я рассчитываю на ваш опыт в этих вопросах.