У меня есть именованный канал клиент/сервер. Сервер работает внутри службы Windows. когда я запускаю свой код в своей локальной интеграции с localhost и dev, он работает нормально; Я могу подключиться к серверу через мой клиент именованного канала. Мои клиентские и серверные реализации выглядят следующим образом:FileNotFoundException на именованной трубе
Как уже упоминалось ранее, это отлично работает на моей машине и в среде разработчиков. Я развернул это на тестовом сервере, однако каждый раз, когда мой клиент подключается к серверу, он будет генерировать FileNotFoundException. Я поставил try catch блоки в важных местах в код сервера, но ни один из моих кодов на стороне сервера не справляется с этим исключением, и моя служба завершается с ошибкой.
Любое понимание того, почему это могло произойти, было бы замечательно.
Редактировать
Я обновил свой код, чтобы использовать эту функцию:
private static PipeSecurity PipeSecurity
{
get
{
var security = new PipeSecurity();
security.AddAccessRule(new PipeAccessRule("Users", PipeAccessRights.ReadWrite, AccessControlType.Allow));
security.AddAccessRule(new PipeAccessRule("SYSTEM", PipeAccessRights.FullControl, AccessControlType.Allow));
security.AddAccessRule(new PipeAccessRule(WindowsIdentity.GetCurrent().User, PipeAccessRights.FullControl, AccessControlType.Allow));
security.AddAccessRule(new PipeAccessRule(new SecurityIdentifier(WellKnownSidType.AuthenticatedUserSid, null), PipeAccessRights.ReadWrite, AccessControlType.Allow));
return security;
}
}
var pipeStream = new NamedPipeServerStream(PipeName, PipeDirection.InOut, MaxThreads, PipeTransmissionMode.Message, PipeOptions.WriteThrough, 1024, 1024, PipeSecurity);
_logger.InfoFormat("CreatedServerInstance: {0}, Waiting for Connection.", _clientCount+1);
pipeStream.WaitForConnection();
Исключение, кажется, происходит на линии pipeStream.WaitForConnection() как только клиент подключается. это странно, что он не поймает исключения, и он сразу же отключил службу. Моя служба работает под локальной системой. Обратите внимание, что я не использую эти правила в одно и то же время, я просто вложил его, чтобы вы знали, как я пробовал их все индивидуально. Я вырыл через source code explorer too l, который опубликовал микросфт для отслеживания источника FileNotFoundException. Кажется, он исходит от системы \ security \ accesscontrol \ nativeobjectsecurity.cs. Этот класс наследует класс PipeSecurity, чтобы вызвать базовые методы для SetAccessRule и AddAccessRule.
это было легко для меня, чтобы изменить формат имени на клиенте, когда он пытается подключения. тем не менее, по-прежнему вызывает ту же ошибку. Что касается безопасности, моя цель всегда будет запускаться с одного и того же сервера. Я также проверил, что конкретный именованный канал доступен для подключения, когда запущена служба Windows. только когда клиент подключается к тому, что служба выдает ошибку и останавливается. Удивительно, что в нем говорится, что исключение необработанно, и это не так, поскольку я включил try catch во все методы на сервере. – vaibinewbee
@vaibinewbee, даже если вы запустите своего клиента на том же сервере - если именованный канал создается службой, весьма вероятно, что служба работает в другом процессе, который может выполняться с повышенными привилегиями. Вы должны будете убедиться, что клиент позволяет подключиться! –
Хорошо. Я буду играть с материалами безопасности. Спасибо за ваши рекомендации. – vaibinewbee