我已经创建了一个Windows Service + WCF服务项目la MSDN's How to: Host a WCF Service in a Managed Windows Service。
在我的情况下,我有一个由Windows服务的OnStart初始化的计时器。我希望WCF服务能够访问,查询和连接Windows服务的数据,例如,启动和停止计时器。
我不想在WCF服务类中创建计时器,以便WCF类的生命周期可以是PerCall(对吗?或者我应该改变它?)。 WCF类如何找到计时器对象?
答案 0 :(得分:1)
老实说:它不能。
您的Windows服务将包含ServiceHost
,这是WCF服务调用的托管环境。在WCF服务调用内,您可以访问其.Host
- 例如在您的Windows NT服务中运行的ServiceHost
实例 - 但您无法“进一步”实现这一点。
要访问给定服务方法的主机,请使用以下代码行:
ServiceHost yourHost = OperationContext.Current.Host;
所以你需要研究的是一种在服务主机对象上提供该计时器的方法 - 例如通过创建自己的自定义ServiceHost
后代,可以访问/包含有问题的计时器。
我认为在WCF服务调用中没有任何其他方式可以“伸出”。
答案 1 :(得分:1)
我总是建议@marc_s提供的任何建议。但在这种情况下,算上我很困惑。
如果计时器是Windows服务的成员,那么您有几个选项。您可以向返回Windows服务实例的Windows服务类添加公共静态方法,或者可以向Windows服务类添加一些公共静态方法,直接为计时器提供接口。
请注意,由于WCF服务调用在其自己的线程中运行,因此您需要同步对计时器的访问权限,以便您不会同时尝试访问多个WCF服务调用。
此外,包含WCF服务的程序集必须引用Windows服务程序集才能使其正常工作。这可能会带来一些必须解决的问题。
简而言之,我认为这可以使用静态方法/实例来完成。只需确保解决多线程问题。
答案 2 :(得分:0)
您可以使用ECollective执行此操作 - ECollective在同一容器中托管WCF服务以及计时器服务,以便您可以在两者之间进行通信。