Configuration 为Windows服务保留用户可编辑设置的最佳方法是什么?

Configuration 为Windows服务保留用户可编辑设置的最佳方法是什么?,configuration,windows-services,settings,app-config,Configuration,Windows Services,Settings,App Config,我正在开发一个应用程序,它将被实现为一个Windows服务,我想知道处理不同设置(在用户和应用程序级别)的最佳方法是什么。问题是,我还不完全熟悉所有可用的选项,所以原则上我倾向于.NET自己的系统配置(ConfigurationManager.RefreshSection(“appSettings”)似乎很吸引人),尽管我仍然无法理解整张图,即,为给定服务存储的app.config文件在哪里,依此类推 所以我的问题是,对于给定的Windows服务,存储用户可编辑配置详细信息的最佳方法是什么?提前

我正在开发一个应用程序,它将被实现为一个Windows服务,我想知道处理不同设置(在用户和应用程序级别)的最佳方法是什么。问题是,我还不完全熟悉所有可用的选项,所以原则上我倾向于.NET自己的系统配置(ConfigurationManager.RefreshSection(“appSettings”)似乎很吸引人),尽管我仍然无法理解整张图,即,为给定服务存储的app.config文件在哪里,依此类推


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

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

Hmmm..Windows服务的“用户可编辑”配置设置

需要记住的是,Windows服务在后台运行,因此用户无法直接与之交互。我所做的是创建一个单独的前端应用程序,使用WCF与Windows服务进行通信。这样,“用户可编辑”配置设置将作为前端应用程序设置的一部分而不是Windows服务的一部分保留。当用户更改设置时,这些设置只需使用一系列WCF消息传递给Windows服务

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

编辑:

作为对您评论的回应,WCF只是一个消息传递API。消息通常定义为用DataContract和DataMember属性修饰的类。ServiceContract和OperationContract属性定义WCF服务接口。一旦定义了这些,在Windows服务中创建和托管WCF服务就很容易了。如果您有VisualStudio2008,那么创建客户端代理非常简单,因为VS2008可以为您实现自动化

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

当然,所有这些都假设您至少可以使用.NET3.0。如果您使用的是Visual Studio 2008,那么您的状态很好。以下是一些帮助您入门的教程:

一旦你有了基本概念,我建议你看看朱瓦尔·洛伊的。那里有很多与WCF相关的免费下载,我觉得非常有帮助,尽管它有点高级。在深入研究WCF之前,先了解WCF概念

同样,这一点的全部目的是帮助用户配置Windows服务的各个方面。如果您不提供前端GUI来实现这一点,我不知道除了手动操作app.config文件本身之外,他们会怎么做


希望这能有所帮助。

Matt,非常感谢您的评论,非常感谢。虽然我不太熟悉通信基金会,但你的方法似乎很有趣,但我关心学习曲线可能会产生怎样的步骤。我很想了解您对此的想法。您对前端应用程序写入注册表以及服务读取注册表值有何看法?我不建议将注册表用作IPC机制。@MattDavis我不建议将IPC替换为注册表:)问题是关于存储“用户可编辑设置”。我建议前端应用程序将这些设置写入注册表,Windows服务读取这些注册表设置。明白,但如何与Windows服务通信设置已更改?除非有事件机制(看起来可能有),否则您必须定期轮询。另一件事是,用户可能需要提升权限才能修改注册表。这是一种方法,但仍然不推荐IMHO。谢谢Dave,介意在我执行InstallUtil.exe/I MyWindowsService.exe操作之后详细说明它的具体位置吗?我假设您有一个app.config文件作为解决方案的一部分。构建解决方案时,它将与可执行文件一起复制到输出目录(通常称为“Debug”或“Release”),并重命名为可执行文件的名称加上.config扩展名。例如,如果可执行文件为MyWindowsService.exe,则app.config文件将重命名为MyWindowsService.exe.config。但即使如此,一旦文件交付,用户也没有一种方便的方式来编辑它。这就是为什么前端应用程序在这里很有意义。此外,每次安装新版本时,此配置文件都会被覆盖,因此每次对此文件的管理更改都会丢失。这很糟糕,但是将设置存储在user.settings文件中对用户来说是违反直觉的