为 Windows 服务保留用户可编辑设置的最佳方式是啥?

Posted

技术标签:

【中文标题】为 Windows 服务保留用户可编辑设置的最佳方式是啥?【英文标题】:What would be the best way to persist user-editable settings for a Windows Service?为 Windows 服务保留用户可编辑设置的最佳方式是什么? 【发布时间】:2010-11-15 05:27:46 【问题描述】:

我正在开发一个将作为 Windows 服务 实现的应用程序,我想知道处理不同 设置 的最佳方法是什么(在用户和应用程序级别)。问题是,我对所有可用选项并不完全熟悉(还),所以原则上我更喜欢 .NET 自己的 System.Configuration (ConfigurationManager.RefreshSection("appSettings") 似乎很诱人),尽管我仍然无法理解整个情况,即为给定服务存储的 app.config 文件在哪里,等等。

所以我的问题是,为给定的 Windows 服务存储用户可编辑的配置详细信息的最佳方式是什么?提前感谢大家的反馈。

【问题讨论】:

【参考方案1】:

如果您只需要一个名称/值字典来存储您的配置参数,那么 app.config 是最简单的答案。在您的解决方案中,它被称为“app.config”,但在构建时它被重命名为可执行文件的名称 +“.config”。

【讨论】:

谢谢 Dave,在我执行 InstallUtil.exe /i MyWindowsService.exe 之后,介意详细说明它的确切位置吗? 我假设您的解决方案中有一个 app.config 文件。当您构建解决方案时,它会与您的可执行文件一起被复制到输出目录(通常命名为“Debug”或“Release”),并重命名为可执行文件的名称加上 .config 扩展名。例如,如果您的可执行文件是 MyWindowsService.exe,则 app.config 文件将重命名为 MyWindowsService.exe.config。但即便如此,一旦文件交付,您的用户也没有一种方便的方式来编辑此文件。这就是前端应用在这里很有意义的原因。 此外,每次安装较新版本时,此配置文件都会被覆盖,因此每次对该文件的管理更改都会丢失。这很糟糕,但是将设置存储在 user.settings 文件中对于不熟悉内部工作的任何人来说都是违反直觉的。我还没有找到好的解决方案。【参考方案2】:

嗯……Windows 服务的“用户可编辑”配置设置……

要记住的是,Windows 服务在后台运行,因此它没有直接的方式让用户与之交互。我为解决这个问题所做的是创建一个单独的前端应用程序,该应用程序使用 WCF 与 Windows 服务进行通信。通过这种方式,“用户可编辑”配置设置作为前端应用程序设置的一部分保留,而不是 Windows 服务。当用户更改设置时,这些设置会使用一系列 WCF 消息简单地传达给 Windows 服务。

在我的例子中,我什至在我的前端应用程序中添加了一个 NotifyIcon 并添加了逻辑,以便在应用程序最小化时可以从任务栏中删除它。当您打开“最小化时隐藏”选项时,它的工作方式与任务管理器的工作方式相同。这给了用户直接与服务交互的错觉,即使它是两个完全独立的进程。

编辑:

针对您的评论,WCF 只是一个消息传递 API。消息通常定义为用 DataContract 和 DataMember 属性修饰的类。 ServiceContract 和 OperationContract 属性定义 WCF 服务接口。一旦定义了这些,在 Windows 服务中创建和托管 WCF 服务就很容易了。如果您有 Visual Studio 2008,创建客户端代理很容易,因为 VS2008 可以为您自动完成。

完成所有这些后,您的前端应用程序只需实例化客户端代理的一个实例并调用该代理上的方法。在调用每个方法时,WCF 框架负责将消息序列化并将其发送到 WCF 服务以供其操作。然后它将任何响应(包括异常)序列化回代理。从客户端的角度来看,例如您的前端应用程序,您只是调用了一个函数。这就是 WCF 的魅力所在!它非常类似于套接字编程,只是您不必管理连接。 WCF 会为您处理所有这些问题。

当然,所有这些都假设您至少可以使用 .NET 3.0。如果您使用的是 Visual Studio 2008,那么您的状态就很好。这里有几个教程可以帮助您入门:

WCF Essentials WCF Services

了解基本概念后,我建议您查看 Juval Lowy 的 website。那里有很多与 WCF 相关的免费下载,我发现它们对查看很有帮助,尽管它更高级一些。在深入研究之前先了解 WCF 概念。

同样,这样做的重点是帮助您的用户配置您的 Windows 服务的各个方面。如果您不提供前端 GUI 来执行此操作,我不确定他们如何在不手动操作 app.config 文件本身的情况下执行此操作。

希望这会有所帮助。

【讨论】:

马特,非常感谢您的评论,非常感谢他们。您的方法似乎很有趣,尽管由于我不熟悉 Communications Foundation,但我担心学习曲线可能会产生多大的步骤。很想了解您对此的看法。 您如何看待前端应用程序写入注册表以及读取注册表值的服务? 建议使用注册表作为 IPC 机制。 @MattDavis 我不建议用注册表替换 IPC :) 问题询问有关存储“用户可编辑设置”的问题。我建议前端应用程序将这些设置写入注册表,并由 Windows 服务读取这些注册表设置。 了解,但您如何与 Windows 服务沟通设置已更改?除非有事件机制(看起来可能有),否则您必须定期轮询。另一件事是,用户可能需要提升权限才能修改注册表。这是一种的方法,但恕我直言,仍然不推荐。

以上是关于为 Windows 服务保留用户可编辑设置的最佳方式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

修改Widows网络设置提升网速

在用户注销时保留 CoreData 对象的最佳方法(NSUserDefaults?)

保留几个组合框(列表框)的最佳表结构是啥

Keycloak 授权 - 最佳实践角色与组

WPS复制粘贴默认为无格式文本,想改为保留原格式

c#从Windows服务启动应用程序的最佳方式