无法从App.Config中检索密钥

时间:2010-01-29 21:51:24

标签: asp.net

在我的WAP项目中,我引用了另一个C#项目(非Web)。在那个C#项目中,我有一个app.config,我将其重命名为[projectName] .config

然后我尝试从我的[Project] .config中获取一个来自我的C#项目中的一些代码的密钥,它找不到它:

return ConfigurationManager.AppSettings["somekey"]

所以我想知道为什么它无法读取我的app.config。我认为ConfigurationManager能够从Web项目的web.config和我的[projectName] .config(app.config)文件中读取密钥吗?

6 个答案:

答案 0 :(得分:7)

ConfigurationManager将读取the configuration of the application's host。在您的情况下,Web应用程序是应用程序的主机 - 因此,调用ConfigurationManager将从您的web.config中读取 - 即使您从引用的dll调用ConfigurationManager。

如果您的Web应用程序引用了一个dll,那么该DLL应该从web.config获取其配置。这是应用程序的最佳选择。如果dll由多种类型的应用程序引用,则配置中的设置可能需要不同。

答案 1 :(得分:5)

尝试将其放入web.config中:

<appSettings file="externalSettings.config"/>

externalSettings.config是您要使用的其他配置文件。

对于非Web程序集,它会查找AssemblyName.dll,其中AssemblyName对应于程序集名称。例如:如果您的程序集名称为Com.MyProject.Library1.dll,那么它正在查找的配置文件是Com.MyProject.Library1.dll.config

更新: 我对此进行了更多的研究,如上所述here,“ConfigurationManager将从AppDomain加载应用程序时加载的配置文件中读取”。因此,对于Web应用程序,如果从aspx代码中访问ConfigurationManager,它将从web.config文件中读取。

我认为最合适的解决方法就是我已经提供的解决方法,即使用appSettings配置参数,这将允许您为aspx应用程序提供共享配置文件,你的班级图书馆。

例如,在您的共享配置文件中,您需要这样的内容:

<appSettings>
    <add key="Key1" value="test"/>
</appSettings>

我们说这个文件是c:\temp\shared.config。然后在你的web.config中,你可以像这样引用它:

<appSettings file="C:\\temp\\shared.config"></appSettings>

您可以将同一行放在类库的app.config中。

现在你可以使用:

ConfigurationManager.AppSettings["Key1"]

来自您的aspx应用程序或您的类库,您将获得价值。

因此,如果你真的需要在aspx和类库之间共享“通用”配置参数,那就是这样做的。

答案 2 :(得分:1)

始终从执行程序集中读取配置。

所以你应该把所需的设置放到正确的* .config文件中。对于需要编辑此文件的每个人来说都很容易。

答案 3 :(得分:0)

如上所述,您不应该更改您的应用程序.config filename,这不会产生任何影响。原因是默认情况下,编译器将App.config内容复制到Debug [AppName] .exe.config中。然后,当加载应用程序时,.NET CLR会将[AppName] .exe.config中的数据加载到内存中,然后再不会将其触及。

答案 4 :(得分:0)

这里有两种可能性:

首先,如Visual Studio项目中所述here,将.config文件放在项目目录中,并将其“复制到输出目录”属性设置为“始终复制”或“如果更新则复制”。 Visual Studio会自动将文件复制到编译程序集的目录。

您使用ConfigurationManager::OpenExeConfiguration方法显式加载配置的第二种可能性(更多关于它here)。

答案 5 :(得分:0)

这将从bin目录中加载任何* .config文件。

public Configuration DllConfiguration( string filename )
{
    var map = new ExeConfigurationFileMap {
         ExeConfigFilename = Path.Combine( AppDomain.CurrentDomain.BaseDirectory, filename )
    };

    return ConfigurationManager.OpenMappedExeConfiguration( map, ConfigurationUserLevel.None );
}

关于每个dll .config文件的一个很好的讨论作为这个问题的最高投票答案的设计问题C# DLL config file