2011-03-17 183 views
0

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

该计划是让“目标”服务托管一个“源”将与之通信的WCF服务。一旦收到请求,我需要与主机Windows服务进行通信,告诉它完成这项工作。我认为“目标”WCF服务会在“目标”Windows服务将监控的MSMQ上发布消息。一旦完成,WCF服务可以返回给调用者。

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

亲切的问候

迈克尔

回答

0

是啊,这是一个很好的方法。 MSMQ非常适合完成此任务 - 源服务可以通过WCF将消息放入队列中,从而向目标发送请求。只要你想发送一个请求到服务进行异步处理,MSMQ就很好,特别是如果你不需要得到响应。如果您确实需要响应,您也可以将源设置为WCF服务,并且目标可以根据需要发回消息。有几种不同的方法可以通过MSMQ绑定来完成此操作。

+0

所以,你将有WCF服务使用MSMQ绑定,并将它做实际的工作,而不是,比方说,有TcpBinding WCF服务,它把在队列中的消息,并在服务赢得监控队列,然后做的工作? – Michael 2011-03-17 06:20:01

+0

你可以做到这一点没有TcpBinding,所有你需要的是你的源和目标窗口服务。我只会在客户端(源)和服务器(目标)端使用MSMQ绑定。目标可以是承载与MSMQ端点的WCF服务主机Windows服务。源端将具有连接到目标端点的WCF MSMQ客户端绑定。源发送通过WCF MSMQ消息,目标会自动拾取的消息,此时您可以处理它,但是你需要直接在目标服务。 – 2011-03-17 06:25:49

1

允许我不同意。仅仅基于你所描述的内容,使用MSMQ在“目标”WCF服务和托管Windows服务之间进行通信似乎对我来说非常重要。 MSMQ允许不同的进程以故障安全方式进行通信。在你的情况下,WCF服务托管在与Windows服务相同的进程中。因此,尽管MSMQ作为两者之间的通信机制可行,但并非必要。

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

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

C# - WCF - inter-process communication

让我解决一两件事。当您的“目标”WCF服务收到来自“源”的任务请求时,只需将任务回传给Windows服务本身不会执行任何操作。 Windows服务正在运行,是的,但它没有可以利用的执行线程。重点是,为了使任务处理异步,您需要启动一个线程来管理任务。我会建议利用ThreadPool来做到这一点。

希望这会有所帮助。

0

@马特

感谢您的帮助。

想了很多,看看你的方法如何让事情更容易设置和使用。我需要让“目标”服务将工作结果发送回“源”,所以我可能会使用nettcp并使用回调。然后,计划将设置一个新线程,完成工作,并在完成后将响应发送回“源”。

@Andy

感谢您帮助。

我看了看MSMQ,但看到我可能会设置一个新的线程,一旦我收到消息我还不如让Web服务做的工作。

+0

我认为这是一个很好的方法。祝你好运! – 2011-03-17 17:52:57