无法从 App.Config 中检索密钥

Posted

技术标签:

【中文标题】无法从 App.Config 中检索密钥【英文标题】:Not able to retrieve key from App.Config 【发布时间】:2011-01-11 01:06:54 【问题描述】:

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

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

return ConfigurationManager.AppSettings["somekey"]

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

【问题讨论】:

您的“somekey”是否位于 project.config 文件中的 之间? 您的文件名为project.config 还是project.exe.config 位于project.exe 应用程序旁边?你真的不应该重命名 app.config,因为它会在编译时自动重命名为 project.exe.config ..... 将我的文件改回 app.config。重新编译了我的 C# 项目(我的 Web 项目引用),但在我的 .aspx 的代码隐藏中,它仍然无法从我引用的项目的 app.config 中读取该配置键 【参考方案1】:

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

如果您的 Web 应用程序引用了一个 dll,那么该 dll 应该从 web.config 中获取其配置。这对应用程序来说是最好的。如果dll被多种类型的应用程序引用,config中的设置可能需要不同。

【讨论】:

【参考方案2】:

试着把它放在你的 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 和类库共享“通用”配置参数,这就是这样做的方法。

【讨论】:

hmm,我想既然我已经将其他程序集引用到我的 Web 项目中,它可以自动找到该配置文件。也许是因为我重命名了它? 很可能,是的。我最初的反应(我已删除)是它查找 AssemblyName.dll.config(其中 AssemblyName 是您的非 Web 项目程序集的名称)。因此,如果您重命名它,它将无法找到它。但如果您出于某种原因想使用不同的名称,我认为上述方法也是一个很好的解决方案。【参考方案3】:

配置总是从正在执行的程序集中读取。

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

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

这里有两种可能:

首先,如 Visual Studio 项目中的 here 所述,将 .config 文件放在项目目录中,并将其 Copy To Output Directory 属性设置为 Copy always 或 Copy if newer。 Visual Studio 自动将文件复制到它编译程序集的目录。

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

【讨论】:

【参考方案6】:

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

public Configuration DllConfiguration( string filename )

    var map = new ExeConfigurationFileMap 
         ExeConfigFilename = Path.Combine( AppDomain.CurrentDomain.BaseDirectory, filename )
    ;

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

在这个问题C# DLL config file987654321@

【讨论】:

以上是关于无法从 App.Config 中检索密钥的主要内容,如果未能解决你的问题,请参考以下文章

如何从加载的 App.config 文件中检索 ApplicationSettings?

如何从 App.config 中检索连接字符串 [重复]

尝试检索不在 app.config 中的设置时返回的内容

无法从密钥环文件 secring.gpg 中检索密钥,因为它不存在

Facebook iOS 上传视频“无法从访问令牌中检索会话密钥。”

C# ConfigurationManager 从 app.config 检索错误的连接字符串