我创建了一个Windows服务,用于执行多个定期操作的自动程序(.Net代码),如备份,健全性检查,报告生成等。构建项目后,我使用installutil
安装了服务。一切都很好。
我决定在App.config
文件中为这些自动程序移动各种“静态”参数。我使用installutil /u
卸载了以前版本的服务,并构建了该项目的新版本。在我的构建输出文件夹中,有一个AppName.exe
文件和一个AppName.exe.config
文件,正如我所料。我以管理员身份从VS 2012开发人员命令提示符中再次使用installutil
安装了新版本的服务。
问题是该服务似乎无法从ConfigurationManager
读取配置文件。对ConfigurationManager.AppSettings("paramname")
的调用不会失败,但结果参数值为空字符串。据我所知,所有参数都会出现问题,而不仅仅是针对特定参数。参数位于<appSettings>
下<configuration>
部分,就像我之前在各种项目中多次完成的一样。
我不知道它是否有帮助,但我的服务在LocalSystem
帐户上运行,并在安装后和Windows上自动启动。
我做错了什么?
编辑:我已经尝试过卸载/重新安装服务(多次),就像一些stackoverflow答案建议的那样。另外,我不打算在运行时更新/刷新文件。
答案 0 :(得分: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");
希望这有帮助!
答案 1 :(得分:0)
原来我在声明的变量中获取配置值,该变量的名称与我用来存储值的属性相同。由于未知原因,我没有收到编译器的警告。由于无法调试Windows服务,解决方案是检查代码/从头开始重写此部分,就在我看到错误的时候。