C# 未为WS-2008 R2上的命名管道设置句柄
我在打开一个指定管道时失败 Windows Server 2008 R2预生产暂存主机 我在一个开发平台上开发代码一点问题都没有 WS 2008 R2主机(配置应相同) 测试管道的运作 应用程序在IIS中有一个WCF RESTful web服务 通过命名管道连接到Windows服务。这个 Windows服务然后通过Perl查询Oracle数据库 剧本但在预生产阶段主机上,我们 不要走那么远,因为管道打不开 第一个问题是访问冲突。当我治愈的时候 通过PipeSecurity实例,我得到了一个丢失的句柄 例外。我在这两个网站上都是管理员 主持人。我已打开所有相关文件夹的访问权限 在预生产主机上(是的,我将再次保护它 一旦成功)。IIS日志没有显示任何异常 WCF服务 下面是开发主机提供的代码 “开箱即用”,没有问题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实例,我得到了一个丢失的
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);