在Windows服务中托管的WCF服务 - 哪一项应该完成所有工作?

时间:2016-06-17 22:23:39

标签: vb.net wcf

我正在编写我的第一个WCF服务,但我不确定服务的主要功能应该在哪里实现。

我的服务的主要目的是按计划执行任务,并最终将其状态记录回远程服务器。 WCF服务的想法是允许系统托盘应用程序和服务之间的通信。我的问题是我应该在哪里实现任务调度和数据库日志记录?

应: A)Windows服务仅托管WCF服务,不执行任何其他操作,让WCF服务完成所有工作和通信。

B)Windows服务托管WCF服务并完成所有工作,让WCF服务进行通信而不做任何其他事情。

对于B,Windows服务如何从WCF服务获取数据? ServiceHost似乎不提供对WCF服务方法的访问。那么我是否需要创建一个新的客户端实例并以与系统托盘应用程序相同的方式连接到WCF服务?是否可以同时连接多个? (我正在使用net.tcp,主要是因为我所使用的教程正在使用它。)我可能希望服务器应用程序稍后连接到客户端的WCF服务。

1 个答案:

答案 0 :(得分:1)

服务没有像程序那样的“主要功能” - 它提供了一个服务合同(接口),其中包含可由服务客户端调用的操作。 WCF允许该合同向可能在不同进程或不同计算机上运行的调用方公开。

实施WCF服务后,您可以通过多种不同方式托管它。一种方法是在Windows服务进程中。为此,您通常会创建一个System.ServiceModel.ServiceHost,其中包含您的服务类型(或实例)和Open()

Windows Service在初始创建之后不与WCF服务实例通信 - 服务主机将处理对地址和绑定指定的端点的任何调用,并将它们分派给您的服务实例。

所以,你的“A”选项最接近你想要的。

您的托盘应用程序将是服务客户端,并将通过向服务发送消息来调用操作(ServiceHost将监听它们)。

要处理多个同时操作,您需要熟悉System.ServiceModel.ConcurrencyMode

请注意,在您的方案中,如果您不希望从另一台计算机调用该服务,您可能需要考虑named pipe binding而不是TCP绑定。