我已经设置了一个系统来让工作进程完成一些工作,并与 GUI 进程和工作进程之间的命名管道进行协调。我在这里启动工作进程:
this.pipeGuidString = Guid.NewGuid().ToString();
var startInfo = new ProcessStartInfo(
"VidCoderWorker.exe",
Process.GetCurrentProcess().Id.ToString(CultureInfo.InvariantCulture) + " " + this.pipeGuidString);
startInfo.RedirectStandardOutput = true;
startInfo.UseShellExecute = false;
startInfo.CreateNoWindow = true;
this.worker = Process.Start(startInfo);
// When the process writes out a line, its pipe server is ready and can be contacted for
// work. Reading line blocks until this happens.
this.logger.Log("Worker ready: " + this.worker.StandardOutput.ReadLine());
bool connectionSucceeded = false;
this.logger.Log("Connecting to process " + this.worker.Id + " on pipe " + this.pipeGuidString);
var binding = new NetNamedPipeBinding
{
OpenTimeout = TimeSpan.FromSeconds(10),
CloseTimeout = TimeSpan.FromSeconds(10),
SendTimeout = TimeSpan.FromSeconds(10),
ReceiveTimeout = TimeSpan.FromSeconds(10)
};
this.pipeFactory = new DuplexChannelFactory<IHandBrakeEncoder>(
this,
binding,
new EndpointAddress("net.pipe://localhost/" + pipeGuid + "/VidCoder"));
this.channel = this.pipeFactory.CreateChannel();
this.channel.Ping();
然后在工作进程内部:
host = new ServiceHost(
typeof (HandBrakeEncoder),
new Uri[]
{
new Uri("net.pipe://localhost/" + PipeGuidString)
});
host.AddServiceEndpoint(
typeof (IHandBrakeEncoder),
new NetNamedPipeBinding(),
"VidCoder");
host.Open();
encodeComplete = new ManualResetEventSlim(false);
Console.WriteLine("Service state is " + host.State + " on pipe " + PipeGuidString);
encodeComplete.Wait();
host.Close();
它适用于大多数人(包括我)100% 的时间。但是一位用户报告说,主机进程在尝试连接到工作进程时总是会收到 EndpointNotFoundException,即使日志表明双方的 GUID 相同并且工作进程的状态是 Opened。
我认为他的系统一定有一些不同的东西导致了失败,我想知道那可能是什么。
- 我已经尝试通过远程桌面进行连接,但它仍然适用于我。
- 我没有更改任何一个流程的强制完整性级别
- 我读了这个答案,所以我要求用户运行
net localgroup "NETWORK USERS"
,但他的组不存在 - (编辑) Net.Pipe Listener Adapter 服务已为用户禁用,但在用户启用并启动后它仍然无法工作。
关于为什么会发生这种情况的任何其他想法?我阅读了一些有关本地与全局命名管道的内容,但由于我在本地进行通信并在本地生成进程,因此它似乎不应该成为问题。
(edit2) 用户意外地能够获得 WCF 跟踪:http ://engy.us/misc/TracesWithNetPipeStarted.svclog
(edit3)它显然在以管理员身份运行主机进程时有效。是不是在这种情况下,管道通信的某些部分需要这些权限?如何设置管道通道,使其永远不需要管理员?