【问题标题】:How can I check that a WCF host is available before I use a channel from a client?在使用来自客户端的通道之前,如何检查 WCF 主机是否可用?
【发布时间】:2010-11-07 20:39:57
【问题描述】:

我正在创建一个启动多个从属进程的 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 恢复以重试我的远程呼叫?

【问题讨论】:

    标签: .net wcf interprocess channel


    【解决方案1】:

    从故障状态恢复的唯一方法是通过重新构建实例并调用 Open() 方法来重新初始化 WCF 客户端。

    一般来说,在我调用服务之前,我总是检查状态属性,如果它没有打开,我会尝试重新初始化它,如上所述。如果失败,则服务器有问题。 (在我的例子中,状态由于不活动而出错,所以初始化通常会成功)

    【讨论】:

    • 您实际上将如何重新构建实例?您是否创建了对象的新实例?
    • 对象之间的职责需要重新调整,但我现在已经启动并运行了。谢谢
    【解决方案2】:

    您可以附加到主机上的“ServiceFaulted”事件,并使用它来执行错误处理。根据文档,正确的操作是中止主机。然后您可以尝试重新初始化它,但如果系统出现故障,这可能是徒劳的。

    【讨论】:

    • 问题不在主机上。主机启动并运行。问题出在客户端。
    【解决方案3】:

    也许您可以实现基于“会话”的服务。因此客户端打开 WCF 通道并进行调用以打开会话(例如“打开”调用)。这会让你的主机知道从机正在监听。

    您可能想研究 WCF 的回调机制,以便通过从它初始化后发出的“打开”调用的回调提供与从站的远程通信。

    Alex Drenea 说您想创建一个新实例是正确的。我建议查看 WCF 中的 ChannelFactory 类来创建代理。您可以将它与一些 try catch 类型的行为一起使用来处理从站的初始启动。您可能还想在您的从属进程启动代码中放置一个 System.Diagnostics.Debugger.Break(),因为调试器可能未附加,因此您在从属进程中看不到异常。

    请问您是否真的需要进程隔离,或者使用同步和线程是否足以完成您的任务?

    【讨论】:

    • 从属进程运行第三方应用程序的实例,这些实例具有一些我们不希望在主进程中出现的奇怪行为。我们目前已经用线程实现了它,并且正在将它转移到单独的进程中。
    • 好。我遇到了一些 unix 程序员,他们只是有这种在 Windows 中创建进程的冲动,而且在大多数情况下这是错误的做法。命名管道问题有什么运气吗?
    猜你喜欢
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多