外部AppSettings文件未与web.config合并

10
在我的应用程序中,有一个名为web.config的文件,其中包含一个appSettings部分。 appSettings部分包含应用程序使用的多个键。 appSettings部分还包含file ="AppSettings.config"属性。然后,AppSettings.config文件包含主web.config的某些值的子集。这样做的想法是让web.config包含所有基本/默认设置,然后在AppSettings.config文件中提供默认值的覆盖。
根据此帖子(https://dev59.com/2Gw05IYBdhLWcg3w72I0#6940086),我的设置应该有效(特别是:will merge (and override) settings in the .config file)。
我看到的问题是它不起作用。我有一个默认值为false,然后驱动一些关于显示一些beta报告功能(或不显示)的逻辑,并将AppSettings.config设置为覆盖此键为“true”。遗憾的是,它仍然隐藏了报告系统。但是,如果我更改web.config值,则该项将显示。
可能AppSettings没有被合并吗?如何测试/证明实际发生了什么?
编辑
似乎AppSettings.config文件中存在某种错误。当一切都按预期工作时,合并正好按预期进行。但是,我仍然有一个问题,即如何检测AppSettings.config文件是否存在某种问题。我已经测试过文件是否为有效的XML(它是),但仍然存在一些问题。当我从web.config复制并粘贴正在工作的密钥,然后将其直接放在AppSettings.config中不起作用的密钥下面时,它们似乎是相同的。我期望必须有某种方法在配置文件合并错误的情况下抛出错误?

作为一个随意的想法:在你的外部文件中,你可以尝试使用<remove>元素来操作,看看它是否可以删除主文件中定义的键。如果可以,尝试先删除,然后再在外部文件中添加该键。 - jbl
4个回答

24

我之前也遇到了同样的问题(配置没有按照预期合并),但是在显式删除解决方案文件夹中的 /bin 和 /obj 目录并执行重建后,一切都如预期工作了。因此,我建议您尝试这样做并查看它的效果...

另外,请确保将外部配置文件的文件属性设置为“始终复制”。否则它不会存在于您运行应用程序的 bin 目录中。


2
谢谢你推荐检查构建操作,你刚刚让我省下了不少拔头发的痛苦。 - Marissa
3
点个赞给“始终复制”设置吧,例如右键单击解决方案资源管理器中的文件,选择设置,然后将“复制本地”设置为“始终复制”或“仅当较新”。 - William T. Mallard
3
“Copy aways”救了我的一天。谢谢。 - Reuel Ribeiro

3

我能够确认外部的app.config文件在一个简单的项目中可以使用。

app.Config(与web.config文件在同一目录下)

<appSettings>
  <add key="testAppConfigString" value="APP string exists!"/>
  <add key="testOverrideString" value="!!OVERRIDE string exists in app.config!"/>
</appSettings>

web.config

...
  <appSettings file="app.config">
    <add key="testWebConfigString" value="web config string exists!"/>
    <add key="testOverrideString" value="OVERRIDE string exists in web.config!"/>
  </appSettings>
...

Default.aspx

...
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">

    web: <asp:Label runat="server" ID="lblWeb" /><br/>
    app: <asp:Label runat="server" ID="lblApp" /><br/>
    override: <asp:Label runat="server" ID="lblOverride" /><br/>

</asp:Content>
... 

在 Default.aspx.cs 内部

    protected void Page_Load(object sender, EventArgs e)
    {
        lblWeb.Text = ConfigurationManager.AppSettings["testWebConfigString"];
        lblApp.Text = ConfigurationManager.AppSettings["testAppConfigString"];
        lblOverride.Text = ConfigurationManager.AppSettings["testOverrideString"];
    }

生成的页面应该包含以下文本:
web: web config string exists!
app: APP string exists!
override: !!OVERRIDE string exists in app.config!

1
谢谢!总的来说,我知道这个程序像你测试的那样完美运行。我的问题更多是关于合并失败方面的事情。有些东西出了问题,但我并不知道是什么。除了受设置控制的行为错误之外,没有任何提示告诉我它不对劲。如果能够捕获错误并通知某人,比如说这里可能有配置错误、语法错误、XML 错误等,而不是删除和重新添加,然后神奇地让它再次开始工作,那就太好了。我很高兴它现在可以正常工作,但我想知道为什么它之前不能工作! - reidLinden
有趣的是...我从零开始创建的项目,如果外部配置中存在错误文本,我会收到一个错误页面。你使用的.net和visual studio版本是什么? - caspian

2

您可以使用WebConfigurationmanager方法访问多个配置文件。添加命名空间:

using System.Web.Configuration;

今日免费次数已满, 请开通会员/明日再来
var config = WebConfigurationManager.OpenWebConfiguration("~/SomeProjectFolder/Environment/");
string username = config.AppSettings.Settings["username"].Value;

希望这能帮到你。

当我使用此语法时,我会收到“System.ArgumentException:'不允许在这里使用应用程序相关的虚拟路径'〜/'。'” 的错误信息。 - fix

1
或许值得一提的是,使用 Web.config 时,connectionStrings/@configSourceappSettings/@file 是相对于项目目录(而不是目标目录)的。这曾经困扰了我一段时间。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接