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

时间:2013-09-16 15:54:28

标签: asp.net web-config

在我的应用中,我有一个带有appSettings部分的web.config文件。 appSettings部分包含应用使用的许多键。 appSettings部分还包含file="AppSettings.config"属性。然后,AppSettings.config文件包含主web.config中的值的子集。我们的想法是让web.config包含所有基本/默认设置,然后提供AppSettings.config文件中默认值的覆盖。

根据这篇文章(https://stackoverflow.com/a/6940086/216160),我的设置应该有效(特别是: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中的非工作键的正下方时,它们似乎是相同的。我希望在配置文件合并错误的情况下必须有某种方法来抛出错误吗?

4 个答案:

答案 0 :(得分:18)

我遇到了同样的问题(配置没有按预期合并),但是在从solution-folder明确删除/ bin和/ obj目录并执行重建后,一切都按预期工作了,所以我建议你试试那看看它是如何运作的......

PS:还要确保将外部配置的文件属性设置为“始终复制”。否则它将不存在于正在运行的应用程序所在的bin目录中。

答案 1 :(得分: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!

答案 2 :(得分:2)

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

using System.Web.Configuration;

所以,要访问

的appSettings

../SomeProjectFolder/Environment/Web.config,你可以这样做:

var config = WebConfigurationManager.OpenWebConfiguration("~/SomeProjectFolder/Environment/");
string username = config.AppSettings.Settings["username"].Value;

希望这有帮助。

答案 3 :(得分:0)

也许值得一提的是,在Web.config中,connectionStrings/@configSourceappSettings/@file相对于 project 目录(不是目标目录)。那有我一段时间了。