我正在编写一个应用程序,其中一个Windows服务需要与另一个Windows服务进行通信。 “目标”服务将接受来自“源”服务的请求并将执行任务。 “源”服务不会等待响应,因此请求应尽快返回。
计划是让“目标”服务托管“源”将与之通信的WCF服务。收到请求后,我需要与主机Windows服务通信,告诉它完成工作。我当时认为“目标”WCF服务会在“目标”Windows服务将监视的MSMQ上放置一条消息。完成此操作后,WCF服务可以返回给调用者。
这听起来像是允许WCF服务告诉托管Windows服务执行任务的合理方法吗?
亲切的问候
迈克尔
答案 0 :(得分: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
来做到这一点。
希望这有帮助。
答案 1 :(得分:0)
是的,这是一个很好的方法。 MSMQ非常适合此任务 - 源服务可以通过WCF将消息放入队列来向目标发送请求。每当您想要向服务发送请求以进行异步处理时,MSMQ都是好的,特别是如果您不需要获得响应。如果确实需要响应,则可以将源设置为WCF服务,并且目标可以根据需要发回消息。有几种不同的方法可以通过MSMQ绑定来实现这一目的。
答案 2 :(得分:0)
@马特
感谢您的帮助。
在考虑了一下之后再看看你的方法如何使设置和使用更容易。我需要让“目标”服务将工作结果发送回“源”,所以我可能会使用nettcp并使用回调。然后计划是设置一个新线程,完成工作,一旦完成,就将响应发送回“源”。
@Andy
谢谢你的帮助。
我看了一下msmq,但看到我收到消息后可能需要设置一个新线程,我也可以让web服务完成工作。