ワーカー プロセスが何らかのジョブを実行できるようにシステムをセットアップし、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% 正常に動作します。しかし、1 人のユーザーは、ホスト プロセスがワーカー プロセスに接続しようとすると常にEndpointNotFoundException を受け取ると報告しています。これは、GUID が両側で同じであり、ワーカー プロセスの状態が Opened であることを示すログがあったとしてもです。
私は、彼のシステムに障害の原因となっている何か別のものがあるに違いないと考えており、それが何であるか疑問に思っています.
- リモートデスクトップ経由で接続しようとしましたが、それでもうまくいきます。
- どちらのプロセスでも必須整合性レベルを変更していません
- 私はこの回答を読んだので、ユーザーに実行するように依頼しました
net localgroup "NETWORK USERS"
が、グループは彼のために存在しません - (編集) Net.Pipe Listener Adapter サービスはユーザーに対して無効にされましたが、ユーザーが有効にして開始した後も機能しませんでした。
なぜこれが起こるのかについて他のアイデアはありますか?ローカルとグローバルの名前付きパイプについていくつか読みましたが、ローカルで通信し、プロセスをローカルで生成しているため、問題になるとは思われませんでした。
(edit2) ユーザーは驚くべきことに WCF トレースを取得できました: http://engy.us/misc/TracesWithNetPipeStarted.svclog
(edit3) ホスト プロセスを管理者として実行している場合に動作するようです。この場合、パイプ通信の一部でこれらの特権が必要だったのでしょうか? 管理者が不要になるようにパイプ チャネルを設定するにはどうすればよいですか?