我正在创建一个启动许多从属进程的Windows服务。在每个从属进程中,我开始在命名管道上侦听来自主进程的消息。
我目前的情况是主进程在从服务器完全启动之前通过命名管道调用从服务器并开始侦听命名管道。
ProcessStartInfo processStartInfo = new ProcessStartInfo("slave");
processStartInfo.Arguments = Address
Process process = new Process();
process.StartInfo = processStartInfo;
process.Start();
base.Endpoint.Binding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.None);
base.Endpoint.Address = Address;
base.Channel.RemoteMethod();
如果我执行此操作,则频道会进入CommunicationState.Faulted
,并且该频道上的所有后续呼叫也会失败。
如何从主站验证从属进程是否开始侦听?或者我如何从CommunicationState.Faulted
恢复以重试我的远程呼叫?
答案 0 :(得分:1)
从Faulted状态恢复的唯一方法是通过重新构建实例并调用Open()方法来重新启用WCF客户端。
通常,在我调用服务之前,我总是检查Status属性,如果它没有打开,我尝试重新初始化它,如上所述。如果失败,则服务器出现问题。 (在我的情况下,由于不活动状态,状态会出现故障,所以初始化通常会成功)
答案 1 :(得分:0)
您可以附加到主机上的“ServiceFaulted”事件,并使用它来执行错误处理。根据文档,正确的操作是中止主机。然后,您可以尝试重新初始化它,但如果系统停机,这可能是徒劳的。
答案 2 :(得分:0)
也许您可以实施基于“会话”的服务。因此,客户端打开WCF频道并拨打电话以打开会话(例如,“打开”呼叫)。这会让你的主人知道奴隶正在听。
您可能想要调查WCF的回调机制,以便通过从初始化后的“打开”调用回调来提供与从站的远程通信。
Alex Drenea说你想要创建一个新实例是正确的。我建议看一下WCF中的ChannelFactory类来创建代理。您可以使用此尝试捕获类型行为来处理从属的初始启动。您可能还希望在从属进程启动代码中放置System.Diagnostics.Debugger.Break(),因为调试器可能未附加,因此您不会在从属进程中看到异常。
我可以问你是否真的需要进程隔离,或者使用同步和线程是否足以完成你的任务?