2010-03-05 100 views
2

我正在用C#开发一个非常基本的Windows服务。除了服务之外,我还需要开发一个程序,用于设置服务的各种参数。服务和程序交互

由于服务和程序将在由不同用户处理的不同运行中运行,我如何告诉服务参数已更改?

我正在考虑的一种方法是将参数保存到配置文件,然后使用ExecuteCommand方法指示设置已更改。该服务将从文件中读取它们。

另一种选择是使用管道将实际数据发送到服务,服务负责保存到服务。

尽管第一个选项更容易编写,但第二个选项似乎更好。

任何建议或任何其他的选择?

谢谢。

回答

1

我有一个小项目,有点这两个。使用IPC将设置传递给客户端,客户端在客户端修改设置并将其发送回去。当服务收到新设置时,它使用ConfigurationManager保存设置并相应地进行更新。我们经历了巨大的痛苦,无需重启就可以重新配置服务。

更新为了满足Giorgi的要求更多的信息:

我们使用Remoting的,但你可以,而且也应该使用WCF。积极的副作用是您可以将绑定更改为可路由的IP,并让远程用户配置服务(如果需要)。这增加了安全考虑,但您可以在WCF中进行处理,并按照您认为合适的方式进行远程处理。

我相信我们不能只发送ConfigurationElements或部分通过服务,所以我们只是创建了一个简单的设置类,并且来回传递。在服务方面,我们有服务将Settings类转换为更新的ConfigurationElement,并使用ConfigurationManager保存配置。对我们来说工作得很好,但是如果你有很多可配置元素或复杂的配置模式,我可以看到这是一个巨大的痛苦。如果开始变得复杂,您可能只想使用自己的配置API,以便完全控制类型和生命周期。

最后,您需要确保执行实际工作的服务部分在可以安全地重新配置时定期检查配置更改,并且配置启动时已进行的处理不会受到更改的影响。一个简单的方法是当服务从客户端收到信号时停止服务处理,并在客户端完成时恢复服务。

+0

关于它的任何提示?在我的情况下,这项服务非常简单,所以我认为它不应该很难重新配置。 – Giorgi 2010-03-05 20:58:36

2

由于您必须将这些设置保存在某个地方,因此您可以让该服务监视这些更改。如果将设置写入配置文件,则该服务可以使用FileSystemWatcher。如果您将它们写入注册表,则可以使用注册表查看器(请参阅 SO)。

但ExecuteCommand很干净,很好。

+0

文件的问题是我可能将程序与服务耦合。 – Giorgi 2010-03-05 20:56:11

+1

服务和GUI需要进行通信,因此无论解决方案如何,它们都是耦合的。一个普通的文件并不是那么紧密的耦合。它可以说是比两者之间的直接沟通更松散的耦合。 – Timores 2010-03-05 22:18:02

2

您可以将配置参数存储在文件中,并使用服务中的FileSystemWatcher来监视更改。

Interprocess Communication也有各种选择,但对于一个简单问题来说,这是一个更复杂的解决方案。