2

我已经设置了一个系统来让工作进程完成一些工作,并与 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)它显然在以管理员身份运行主机进程时有效。是不是在这种情况下,管道通信的某些部分需要这些权限?如何设置管道通道,使其永远不需要管理员?

4

2 回答 2

3

看看这个 SOA question and answer,它详细解释了一个特定会话本地的 WCF NetNamedPipeBinding 服务如何被全球发布的不相关应用程序阻止,如果后者的服务 URL 被粗心选择。

对于您描述的情况,这似乎是一个合理的解释。

于 2013-04-22T21:18:52.217 回答
0

我可以确认安装 Garmin Express 会干扰命名管道。例如,尝试在 VS 中以非管理员模式运行单元测试会导致测试运行程序挂起。卸载 Garmin Express 可解决此问题。

于 2013-05-02T09:03:28.087 回答