Windows 服务无法从 App.config 读取参数

Posted

技术标签:

【中文标题】Windows 服务无法从 App.config 读取参数【英文标题】:Windows service cannot read parameters from the App.config 【发布时间】:2013-10-07 18:45:17 【问题描述】:

我创建了一个 Windows 服务,用于执行多个定期操作的自动化程序(.Net 代码),例如备份、健全性检查、报告生成等。构建项目后,我使用installutil 安装了该服务。一切都很好。

我决定在App.config 文件中移动这些自动化程序的各种“静态”参数。我用installutil /u卸载了之前版本的服务,构建了新版本的项目。正如我所料,在我的构建输出文件夹中,有一个AppName.exe 文件和一个AppName.exe.config 文件。我以管理员身份再次使用 VS 2012 开发人员命令提示符中的 installutil 安装了该服务的新版本。

问题是服务似乎无法从ConfigurationManager 读取配置文件。对ConfigurationManager.AppSettings("paramname") 的调用不会失败,但结果参数值是一个空字符串。据我所知,所有参数都会出现问题,而不仅仅是特定参数。参数位于<appSettings> 部分的<configuration> 下,就像我之前在各种项目中做过多次一样。

我不知道它是否有帮助,但我的服务在 LocalSystem 帐户上运行,并在安装后自动启动并使用 Windows。

我做错了什么?

编辑:我已经尝试卸载/重新安装服务(多次),就像一些 *** 答案所暗示的那样。另外,我不希望在运行时更新/刷新文件。

【问题讨论】:

根据您对服务的编码方式,您可能需要重新启动它,以便它获取 app.config 中的任何更改。例如,如果它在 OnStart 期间读取配置部分并将它们存储在变量中,那么除非您重新启动服务,否则它不会获取更改。所以问题是:你在哪里打电话给ConfigurationManager?我什至见过这样的情况,您在一个 exe 中有多个服务,并且在所有这些服务重新启动之前它不一定会接收更改。 我在每个自动化过程(在 OnStart 期间调用)的构造函数中调用了一次 ConfigurationManager,但我在运行时没有做任何更改,所以我不认为这应该是个问题。另外,我的项目中只有一个服务和一个安装程序。 有趣的是它没有失败但没有得到值。你能发布加载应用设置的实际代码和配置文件的副本吗? 由于保密问题,我无法发布实际代码。但是,我只是在<appSettings> 部分中使用ConfigurationManager.AppSettings("paramname") 和匹配的键/值<add>。我在没有 Windows 服务模板的情况下使用 VS 2012 Express 是否是原因?我从一个空项目开始。 这无关。如果您能够创建和安装服务,那么您就有了服务。没有实际的代码,我无能为力。我只能说,很可能该服务没有读取您认为的配置文件,或者代码本身失败(错误命名的参数),并且您有某种尝试 ..catch 进行静默失败。基本上是基本的代码审查内容。祝你好运。 【参考方案1】:

原来我在一个声明的变量中获取配置值,该变量与我用来存储值的属性同名。由于未知原因,我没有收到编译器的警告。由于无法调试 Windows 服务,解决方案是从头开始检查代码/重写这部分,这就是我看到错误的时候。

【讨论】:

要调试 Windows 服务,请参阅:codeproject.com/Articles/10153/… 和下面的讨论。【参考方案2】:

我通过在运行时设置配置文件的位置解决了这个问题。这使我能够在任何我想要的地方放置和命名配置文件。我获取正在执行的程序集路径,然后检查配置文件是否存在。 Check the answer on this thread how to dynamically set the config file

这就是我获取执行程序集的方式:

var path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
var configFilePath = Path.Combine(path, "service.config");

希望这会有所帮助!

【讨论】:

以上是关于Windows 服务无法从 App.config 读取参数的主要内容,如果未能解决你的问题,请参考以下文章

Windows 服务安装程序未读取 App.Config 文件

如何使用 configurationManager 从 .Net 4.0 中的 App.config 读取值?

无法从 app.config 获取连接字符串

app.config 中的“无法加载类型”

c# Windows服务是不是(可能)使用app.config

使用 App.Config 在 Windows 服务中的 WCF 命名管道