【发布时间】:2011-08-02 07:26:11
【问题描述】:
我正在 .Net 4.0 中创建一个 Windows 服务,并通过引用服务项目使用 Windows 窗体客户端测试所述服务的某些功能。
服务项目有一个 App.config 文件,该文件如下所示:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<clear />
<add name="myLocalMySQLDBUsername" connectionString="username"/>
</connectionStrings>
</configuration>
当属于服务的函数调用时:
- ConfigurationManager.ConnectionStrings("myLocalMySQLDBUsername").ConnectionString
由于未加载我的连接字符串,引发空引用错误。加载的唯一连接字符串来自位于 c:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Config\machine.config 中的 machine.config 文件
如果我为服务创建应用程序范围设置,我可以通过使用 My.Settings.setting -> 来获取该设置,因此不会读取 App.config 文件。
我的问题是:为什么我的 connectionStrings 没有从 App.config 文件中加载?
感谢您的帮助。
更新:
此外,在这一点上,即使是变通方法也将不胜感激;使用 app.config 的唯一原因是能够使用 DpapiProtectedConfigurationProvider 加密内容(内容将包含一些用于服务和数据库连接的用户名/密码值)。
我尝试在 app.config 中手动创建 AppSettings 部分,但配置管理器也未读取这些设置(计数 = 0)。
更新 2:
根据建议,我尝试像这样手动打开 app.config 文件:
Dim exePath As String = System.IO.Path.Combine(Environment.CurrentDirectory, "ServiceName.exe")
Dim myConfig As Configuration = ConfigurationManager.OpenExeConfiguration(exePath)
所以这是奇怪的部分,当我往里看时,路径是正确的(指向我的 app.config),但仍在从 machine.config 文件加载 connectionStrings(我的 connectionStrings 未加载)!!呸
更新 3:
好的,所以,我想通了。当从另一个项目(子)引用一个项目(父)时,即使正在使用父的类,也会使用子的 app.config。因此,如果我将它们复制到孩子的 app.config 中,我可以让 connectionStrings 显示出来。当尝试手动打开它时,我的 currentDirectory 是孩子的,而不是父母的(奇怪的是它没有抛出异常 - 它无法找到配置文件......它只是默默地使用 machine.config ... 那好吧)。
感谢大家的帮助!
【问题讨论】:
-
可能是一个愚蠢的问题,但您如何部署服务及其 app.config?你在正确的目录中有 servicename.exe.config 吗?
-
我还没有部署它......一切仍在我的本地机器上调试。当我部署它时,我会确保配置文件最终位于 System32 文件夹(我认为)或 Windows 服务默认查找文件的任何文件夹中。
标签: c# vb.net .net-4.0 windows-services app-config