Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何从WCF服务访问单例/初始化数据?_.net_Windows Services_Wcf - Fatal编程技术网

.net 如何从WCF服务访问单例/初始化数据?

.net 如何从WCF服务访问单例/初始化数据?,.net,windows-services,wcf,.net,Windows Services,Wcf,我已经在洛杉矶创建了一个Windows服务+WCF服务项目 不过,在我的情况下,我有一个由Windows服务的OnStart初始化的计时器。我希望WCF服务能够访问、查询和连接Windows服务的数据,例如启动和停止计时器 我不想在WCF服务类中创建计时器,以便WCF类的生存期可以是PerCall(对吗?或者我应该改变它吗?)WCF类如何找到计时器对象?老实说:它找不到 您的Windows服务将包含一个ServiceHost,它是WCF服务调用的宿主环境。在WCF服务调用中,您可以访问其.Hos

我已经在洛杉矶创建了一个Windows服务+WCF服务项目

不过,在我的情况下,我有一个由Windows服务的OnStart初始化的计时器。我希望WCF服务能够访问、查询和连接Windows服务的数据,例如启动和停止计时器


我不想在WCF服务类中创建计时器,以便WCF类的生存期可以是PerCall(对吗?或者我应该改变它吗?)WCF类如何找到计时器对象?

老实说:它找不到

您的Windows服务将包含一个
ServiceHost
,它是WCF服务调用的宿主环境。在WCF服务调用中,您可以访问其
.Host
——例如,在Windows NT服务中运行的
ServiceHost
实例——但您无法访问该实例

要访问给定服务方法的主机,请使用以下代码行:

ServiceHost yourHost = OperationContext.Current.Host;
因此,您需要研究的是如何使该计时器在服务主机对象上可用-例如,通过创建您自己的自定义
ServiceHost
子代,该子代可以访问/包含该计时器


我认为在WCF服务呼叫中没有任何其他方式可以“联系”

您可以使用同一容器中的-ecoCollective hosts WCF服务以及计时器服务来完成此操作,这样您就可以在两者之间进行通信。

我始终推荐@marc_s提供的任何建议。不过,在这种情况下,我会感到困惑

如果计时器是Windows服务的成员,那么您有几个选项。您可以向返回Windows服务实例的Windows服务类添加公共静态方法,也可以向直接提供计时器接口的Windows服务类添加一些公共静态方法

请注意,由于WCF服务调用在其自己的线程中运行,因此您需要同步对计时器的访问,这样您就不会有多个WCF服务调用试图同时访问它

此外,包含WCF服务的程序集必须引用Windows服务程序集才能正常工作。这可能会带来一些必须解决的问题


简而言之,我认为这可以通过使用静态方法/实例来实现。只需确保解决多线程问题。

:(我甚至没有看到。我的WCF服务类中的主机,但是如果我看到了,它的生命周期会是什么?我会把计时器放在那里,但它不会被一次又一次地破坏吗?@scott stafford:ServiceHost通常在Windows服务的OnStart事件中打开,并且会一直存在,直到你停止NT服务为止,所以它应该在all次,真的。它毕竟提供了WCF运行时-无服务主机->无服务调用:)@scott stafford:添加了一段代码,说明如何从服务方法中获取ServiceHost感谢您的帮助。使用接受对象而不是类型的ServiceHost构造函数如何?我想这可以有效地使WCF类永远保持不变,但这也行得通,因为我可以构造WCF服务类myse如果需要,然后通过它?@scott stafford:该构造函数构建一个singleton作为您的WCF服务类-我不建议这样做,除非您必须拥有它(例如,访问一个只存在一次的资源)它使WCF服务类的编程变得更加复杂,因为您需要使其完全多线程化——或者,您需要一个单实例来处理一个又一个请求,因此您的可伸缩性非常有限。