Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 未为WS-2008 R2上的命名管道设置句柄_C#_Windows Server 2008 R2_Named Pipes - Fatal编程技术网

C# 未为WS-2008 R2上的命名管道设置句柄

C# 未为WS-2008 R2上的命名管道设置句柄,c#,windows-server-2008-r2,named-pipes,C#,Windows Server 2008 R2,Named Pipes,我在打开一个指定管道时失败 Windows Server 2008 R2预生产暂存主机 我在一个开发平台上开发代码一点问题都没有 WS 2008 R2主机(配置应相同) 测试管道的运作 应用程序在IIS中有一个WCF RESTful web服务 通过命名管道连接到Windows服务。这个 Windows服务然后通过Perl查询Oracle数据库 剧本但在预生产阶段主机上,我们 不要走那么远,因为管道打不开 第一个问题是访问冲突。当我治愈的时候 通过PipeSecurity实例,我得到了一个丢失的

我在打开一个指定管道时失败 Windows Server 2008 R2预生产暂存主机 我在一个开发平台上开发代码一点问题都没有 WS 2008 R2主机(配置应相同) 测试管道的运作

应用程序在IIS中有一个WCF RESTful web服务 通过命名管道连接到Windows服务。这个 Windows服务然后通过Perl查询Oracle数据库 剧本但在预生产阶段主机上,我们 不要走那么远,因为管道打不开

第一个问题是访问冲突。当我治愈的时候 通过PipeSecurity实例,我得到了一个丢失的句柄 例外。我在这两个网站上都是管理员 主持人。我已打开所有相关文件夹的访问权限 在预生产主机上(是的,我将再次保护它 一旦成功)。IIS日志没有显示任何异常 WCF服务

下面是开发主机提供的代码 “开箱即用”,没有问题

ClientPipe = new NamedPipeClientStream(
".", "QueryPipe", PipeDirection.InOut, PipeOptions.None,
TokenImpersonationLevel.None);

ClientPipe.Connect();
简单明了

以下是来自预生产暂存主机的代码 我用endlessley修补过的来试着得到它 工作

PipeSecurity类的使用解决了一个初始问题 具有访问权限(感谢Chris Dickson 2010年的回答 关于设置管道访问)

但在设置访问控制后,我得到了以下异常:

** Pipe Error: System.InvalidOperationException:
Pipe handle has not been set. 
Did your PipeStream implementation call InitializeHandle?
我已经在谷歌上搜索到了指尖的蓝色,但没有 得到一个有用的答案。看来我应该已经有了 仅使用构造函数设置句柄。初始化句柄 不适用于此


因此,我期待您在这些问题上的专业知识。

它可能有权限问题:因此,需要提供所需的访问权限

PipeSecurity _pipeSecurity = new PipeSecurity();
                PipeAccessRule psEveryone = new PipeAccessRule("Everyone", PipeAccessRights.FullControl, System.Security.AccessControl.AccessControlType.Allow);


           _pipeSecurity.AddAccessRule(psEveryone);

            NamedPipeServerStream pipeServer = new NamedPipeServerStream(PipeName,
                               PipeDirection.In, 1, PipeTransmissionMode.Message, PipeOptions.Asynchronous, 4, 4, _pipeSecurity);

要克服只监听一次的问题,请遵循以下设置:右键单击相应的服务>属性>登录>以本地系统帐户的身份登录,然后勾选允许服务与桌面交互。或者转到ServiceProcessInstaller属性并将帐户设置为LocalSystem。

是的,您不能这样做。是服务器调用了SetAccessControl(),列出了被邀请参加聚会的客人的列表。你不在上面。你不能把你自己的名字放在名单上,然后那样进门。你必须知道谁在名单上,这样你就可以模仿他们中的一个。。。。或者修复服务器中的代码。我第一次尝试你的想法是明天上午。但我仍然感到困惑,为什么它在开发过程中运行得这么好。这两台机器的配置似乎不像我听说的那样完全相同。你富有诗意的线索将我引向了正确的方向,我最终在这个线程中找到了解决方案:。作为一个noob,我不知道如何将你们中的一个或两个标记为“答案”。
PipeSecurity _pipeSecurity = new PipeSecurity();
                PipeAccessRule psEveryone = new PipeAccessRule("Everyone", PipeAccessRights.FullControl, System.Security.AccessControl.AccessControlType.Allow);


           _pipeSecurity.AddAccessRule(psEveryone);

            NamedPipeServerStream pipeServer = new NamedPipeServerStream(PipeName,
                               PipeDirection.In, 1, PipeTransmissionMode.Message, PipeOptions.Asynchronous, 4, 4, _pipeSecurity);