我正在用C#开发一个非常基本的Windows服务。除了服务之外,我还需要开发一个程序,用于为服务设置各种参数。
由于服务和程序将以不同用户处理的不同方式运行,如何告知服务参数已更改?
我正在考虑的一种方法是将参数保存到配置文件中,然后使用ExecuteCommand
方法指示设置已更改。然后,该服务将从文件中读取它们。
另一个选择是使用管道将实际数据发送到服务,服务负责保存它们。
虽然第一个选项更容易编写,但第二个选项似乎更好。
有任何建议或任何其他选择吗?
感谢。
答案 0 :(得分:2)
由于您必须在某处保存这些设置,您可以让服务人员监视更改。如果将设置写入配置文件,则该服务可以使用FileSystemWatcher。如果将它们写入注册表,则可以使用注册表观察程序(请参阅 SO)。
但是ExecuteCommand非常干净。
答案 1 :(得分:2)
您可以将配置参数存储在一个文件中,并使用服务中的FileSystemWatcher来监视更改。
Interprocess Communication还有各种选项,但对于一个简单的问题,这是一个更复杂的解决方案。
答案 2 :(得分:1)
我有一个小项目,两者都做了。使用IPC,它将设置传输到客户端,客户端修改了设置并将其发回。当服务收到新设置时,它使用ConfigurationManager保存设置并相应地更新自身。我们经历了巨大的努力,允许服务重新配置而无需重启。
更新要满足Giorgi的更多信息请求:
我们使用了远程处理,但您可以并且可能应该使用WCF。积极的副作用是您可以将绑定更改为可路由IP,并让远程用户配置服务(如果需要)。这增加了安全性考虑因素,但您可以在WCF中进行处理并根据需要进行远程处理。
我相信我们不能只通过服务发送ConfigurationElements
或部分,所以我们只创建了一个简单的Settings类并来回传递。在服务方面,我们让服务将Settings类转换为更新的ConfigurationElement并使用ConfigurationManager
保存配置。为我们工作得很好,但如果你有很多可配置的元素或复杂的配置架构,我可以看到这是一个巨大的痛苦。如果它开始变得复杂,您可能只想使用自己的配置API,这样您就可以完全控制类型和生命周期。
最后,您需要确保执行实际工作检查的服务部分在可以安全重新配置时定期更改配置,并且配置启动时已经进行的处理不会受到更改的影响。一种简单的方法是让服务在收到来自客户端的信号时停止处理,并在客户端说完它时恢复。