2011-04-10 76 views
7

我正在.NET 4.0中创建一个Windows服务,并通过引用服务项目来测试窗体客户机的某些功能。如何使用configurationManager从.Net 4.0的App.config中读取值?

服务项目有一个App.config文件和文件看起来像这样:

<?xml version="1.0" encoding="utf-8" ?> 
    <configuration> 
    <connectionStrings> 
     <clear /> 
     <add name="myLocalMySQLDBUsername" connectionString="username"/> 
    </connectionStrings> 
    </configuration> 

当属于该服务的函数调用:

  • ConfigurationManager.ConnectionStrings( “myLocalMySQLDBUsername”) .ConnectionString

由于我的连接字符串未加载,所以引发空引用错误。加载的唯一connectionStrings来自位于c:\ WINDOWS \ Microsoft.NET \ Framework \ v4.0.30319 \ Config \ machine.config中的machine.config文件

如果我为服务创建应用程序作用域设置,我可以通过使用My.Settings.setting - >来获得该设置,所以它不像App.config文件没有被读取。

我的问题是:为什么我的connectionStrings没有从App.config文件加载?

谢谢你的帮助。

UPDATE:

而且,在这一点上,甚至周围的工作,将不胜感激;使用app.config的唯一原因是能够使用DpapiProtectedConfigurationProvider加密内容(内容将具有用于服务和数据库连接的一些用户名/密码值)。

我试着在app.config中手动创建一个AppSettings部分,但这些设置也没有被配置管理器(count = 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),但connectionStrings仍然从machine.config文件加载(我的connectionStrings不加载)!哎呀

更新3:

好了,所以,我想它了。从另一个项目(子项)引用项目(父项)时,即使正在使用父项的类,也会使用子项的app.config。因此,如果我将它们复制到孩子的app.config中,我可以获取connectionStrings。当试图手动打开它的时候,我的currentDirectory是孩子的,而不是父母(奇怪的是它没有抛出异常 - 它不能找到配置文件......它只是默默地使用machine.config ... 好吧)。

谢谢大家的帮助!

+0

可能是一个愚蠢的问题,但你如何部署服务和它的app.config?你在正确的目录下有servicename.exe.config吗? – 2011-04-10 01:13:34

+0

我还没有部署它......所有仍在我的本地机器上进行调试。当我部署它时,我将确定配置文件在System32文件夹(我认为)或Windows服务默认查找文件的任何文件夹中结束。 – Dima 2011-04-10 01:24:44

+0

变通后发布。 – Hogan 2011-04-10 02:21:25

回答

5

您要做的第一件事是确保服务帐户有权访问该文件(如果不作为SYSTEM运行)。这听起来像应该没问题,但自从你提到My.Settings.Setting的作品。

要注意的另一件事是确保app.config中有服务可执行文件的名称 - 所以如果服务exe文件是MyService.exe,则app.config必须命名为MyService.exe。配置。

最后需要注意的是:库将从加载库的可执行文件的app.config中读取,而不是与库中的app.config一起读取。因此,如果您有服务可执行文件MyService的项目和库的项目MyServiceLibrary,那么库中的代码将从MyService而不是MyServiceLibrary读取app.config。

+0

所有帐户都可以。正确命名(我的意思是,它在编译时是自动命名的,并且在调试文件夹中验证了该名称是正确的)。我想过要使用哪个App.config,并得出与您概述的相同的结论 - 即服务app.config是使用的那个。我仍然为了我的connectionStrings不被读取而在墙上跳动......叹息 – Dima 2011-04-10 01:22:55

+0

我想我最初误解了你的评论/回答,但你是对的。谢谢。 – Dima 2011-04-10 04:19:13

+0

这是最接近真正的答案,但我在我的问题中评论,使其更清晰(我想,我希望)。 – Dima 2011-04-10 04:26:59

0

确保配置文件与可执行文件部署到相同的文件夹,并且它的名称为your.assembly.exe.config

+0

正如我所提到的,如果我创建了一个设置,那么这个设置就可以没有问题地检索出来。 – Dima 2011-04-10 01:18:40

+0

@Dima:用户设置不存储在app.config – 2011-04-10 01:43:26

+0

应用程序设置;对不起,如果不明确。 – Dima 2011-04-10 01:45:45

2

我看到有些人说这个问题可能是由手动加至System.Configuration.dll

边注参考固定:如果这真的是你整个app.config文件,而不只是一个片段,然后是你的问题...你是app.config文件应该更复杂或者.NET将无法加载它。

工作环境:使用配置管理器打开这个配置文件(这里有一个API)。你不能让它自动加载,只是告诉配置管理器打开它。

我仍然认为问题是你的配置文件无效 - 你可以请发布完整的文件吗?

+0

你是什么意思?所有在配置文件中的内容都是我已经粘贴到问题中的。其实,我很高兴你提到这一点,因为我没有设置连接字符串的providerName ...这是一个必要的值吗?如果是这样,我该如何设置它? – Dima 2011-04-10 02:01:04

+0

http://msdn.microsoft。com/en-us/library/ms254500.aspx – Hogan 2011-04-10 02:06:00

+0

@dima nm关于上一个答案 - 试试上面的评论。 – Hogan 2011-04-10 02:10:04

0

我有类似的问题,但在我的情况下,这是因为我改变了项目的名称空间。这也被用作配置文件中的应用程序设置部分元素名称,所以代码没有找到新的部分名称。摆弄项目属性中的一个自定义设置的值并重新编译,导致新节与旧节点一起写入app.config,这就是向我提出的问题。

相关问题