【问题标题】:WCF Communication with HostWCF 与主机通信
【发布时间】:2011-03-18 00:58:59
【问题描述】:

我正在编写一个应用程序,该应用程序具有一个需要与另一个 Windows 服务通信的 Windows 服务。 “目标”服务将接受来自“源”服务的请求并执行任务。 “源”服务不会等待响应,因此请求应尽快返回。

计划是让“目标”服务托管“源”将与之通信的 WCF 服务。收到请求后,我需要与主机 Windows 服务通信以告诉它完成工作。我在想“目标”WCF 服务会将消息放在“目标”Windows 服务将监视的 MSMQ 上。完成此操作后,WCF 服务可以返回给调用者。

这听起来像是允许 WCF 服务告诉托管 Windows 服务执行任务的明智方法吗?

亲切的问候

迈克尔

【问题讨论】:

    标签: wcf windows-services


    【解决方案1】:

    请允许我不同意。仅根据您所描述的,使用 MSMQ 在“目标”WCF 服务和托管 Windows 服务之间进行通信对我来说似乎非常重要。 MSMQ 允许不同的进程以故障安全的方式进行通信。在您的情况下,WCF 服务与 Windows 服务托管在同一进程中。因此,虽然 MSMQ 作为两者之间的通信机制会起作用,但没有必要。

    此外,在“目标”WCF 服务和“源”WCF 服务之间使用 MSMQ 绑定是有意义的如果这两个 WCF 服务并不总是在同时。例如,如果“目标”WCF 服务并不总是运行,则 MSMQ 绑定将允许“源”WCF 服务仍然发送任务。这些任务将存储在 MSMQ 中,以便在“目标”WCF 服务开始运行时进行检索。但是,听起来这两个服务都将运行,所以我看不出需要 MSMQ 绑定。

    有关选择 WCF 绑定,请参阅此 SO 帖子。

    C# - WCF - inter-process communication

    让我谈谈另一件事。当您的“目标”WCF 服务接收到来自“源”的任务请求时,简单地将任务传回 Windows 服务本身并不会做任何事情。 Windows 服务正在运行,是的,但它没有您可以利用的执行线程。关键是为了使任务处理异步,您需要启动一个线程来管理任务。我建议利用ThreadPool 来执行此操作。

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      是的,这是一个很好的方法。 MSMQ 非常适合此任务 - 源服务可以通过 WCF 将消息放在队列中来向目标发送请求。当您想向服务发送请求以进行异步处理时,MSMQ 非常适合,尤其是在您不需要返回响应的情况下。如果您确实需要响应,您也可以将源设置为 WCF 服务,并且目标可以在需要时发回消息。使用 MSMQ 绑定有几种不同的方法可以实现这一点。

      【讨论】:

      • 那么您是否会让 WCF 服务使用 MSMQ 绑定并让它执行实际任务,而不是让 TcpBinding WCF 服务将消息放入队列并让 Win 服务监视队列然后干活?
      • 你可以在没有 TcpBinding 的情况下做到这一点,你所需要的只是你的源和目标 Windows 服务。我只会在客户端(源)和服务器(目标)端使用 MSMQ 绑定。目标可以是一个 Windows 服务,它承载具有 MSMQ 终结点的 WCF 服务主机。源端将有一个连接到目标端点的 WCF MSMQ 客户端绑定。源通过 WCF MSMQ 发送消息,目标将自动获取该消息,此时您可以直接在目标服务中处理它。
      【解决方案3】:

      @马特

      感谢您的帮助。

      在仔细考虑之后,看看您的方法如何使设置和使用变得更容易。我需要让“目标”服务将工作结果发送回“源”,所以我可能会使用 nettcp 并使用回调。然后计划是设置一个新线程,完成工作并在完成后将响应发送回“源”。

      @安迪

      感谢您的帮助。

      我查看了 msmq,但看到我可能必须在收到消息后设置一个新线程,我不妨让 Web 服务完成这项工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多