我没有成功打开一个命名管道 Windows Server 2008 R2预生产暂存主机 我在开发上开发代码时没有遇到任何麻烦 WS 2008 R2主机(应配置相同) 并测试该管道的操作。
该应用程序在IIS中具有WCF RESTful Web服务 通过命名管道连接到Windows服务。该 Windows Service然后通过Perl查询Oracle DB 脚本。但是对于前期制作的舞台主持人我们 从来没有那么远,因为管道无法打开。
第一个问题是访问冲突。我治好了 使用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类解决了一个初始问题 具有访问权限(感谢Chris Dickson的2010年回答 关于设置管道访问权限。)
但在设置访问控制后,我得到了这个例外:
** Pipe Error: System.InvalidOperationException:
Pipe handle has not been set.
Did your PipeStream implementation call InitializeHandle?
我用Google搜索直到蓝色,但不要 得到一个有用的答案。看来我应该已经拥有了 仅使用构造函数设置句柄。 InitializeHandle 不应该在这里适用。
所以,我期待你在这些方面的专业知识。
答案 0 :(得分:0)
它可能有权限问题:因此,需要提供所需的访问权限。
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。