我有一个所有客户端都连接到的WCF服务,以便获得通知\提醒(使用它们实现的回调接口)。目前WCF服务是自我托管的,但计划是将其托管在Windows服务中。
WCF服务具有“发布”、“订阅”和“取消订阅”操作。
我需要一个后台工作线程,每隔30分钟就有一个server数据库表轮询,并查找某些“提醒”行。一旦它找到了它们-它应该通知所有连接的客户端。
我想到了实现这一目标的两种方法。
。
方法A :
有一个单独的EXE项目(不希望它是一个控制台,那么它应该是什么-一个Windows服务?)它将启动并运行后台线程。后台线程将作为其客户端连接到“提醒”服务。后台线程将轮询数据库,一旦发现--它将向WCF服务发送一条“发布”消息,这将使WCF服务向所有订阅的客户端发送提醒。
。
方法B :
以某种方式使后台线程在WCF服务项目中运行,当它在数据库中检测到一个新的提醒行时,以某种方式让它用‘信号’通知WCF服务,然后WCF服务会将这个信息发送给所有订阅的客户端。
。
哪种方法更好?还有其他建议吗?
发布于 2013-01-29 02:10:06
方法A:
如果您要创建两个单独的主机(一个用于WCF服务,另一个用于“轮询”服务),那么您实际上只有一个选项可以使所有主机都很好地工作。
Windows Service通信非常有限(没有服务端点的帮助,例如WCF)。因此,如果要在Windows服务中承载“轮询”服务,则必须将其与WCF服务相结合。
然后,通过手动实例化WCF主机并将“轮询”服务传递给构造函数,将两个服务一起托管在一个Windows中是可行的。
protected override void OnStart(string[] args)
{
//...
// This would be you "polling" service that would start a background thread to poll the db.
var notificationHost = new PollingService();
// This is your WCF service which you will be "self hosted".
var serviceHost = new WcfService(notificationHost);
new ServiceHost(serviceHost).Open();
//...
}这并不理想,因为您需要通过两个服务之间的事件进行通信,而且您的WCF服务必须在单例模式下运行,才能手动实例化.所以这给你留下了..。
方法B:
如果要在WCF服务中托管“轮询”服务,则会遇到许多问题。
方法C:
鉴于方法A和B的缺点,最好的解决方案是托管两个独立的WCF服务。
其想法是,您的常规服务在接收到订阅服务器时将打开到您的轮询服务的新连接或使用现有的连接(取决于您配置会话的方式),并等待回复。轮询服务是一个长期运行的WCF服务,它轮询数据库并将通知发布给它的订阅者(即其他WCF主机)。
Pros:
Cons:
发布于 2012-06-30 13:38:40
如果这是一个长期运行的过程,windows服务就是完美的解决方案。您的主要Win Service线程将轮询DB,将结果排队到某种类型的供应商/消费者线程安全集合中。
您可以在win服务中托管一个WCF服务,然后WCF可以使用(删除)队列中的任何结果,并根据请求将它们传递回客户端(对WCF的调用将通过它们自己的线程进行)
这是一个相当常见的体系结构,并且不难实现。
https://stackoverflow.com/questions/11274411
复制相似问题