9

在我的应用程序中,我有一个带有 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

4 回答 4

19

我只是遇到了同样的问题(配置没有按预期合并),但是在从解决方案文件夹中明确删除 /bin 和 /obj 目录并执行重建后,一切都按预期工作了,所以我建议你试试看这个怎么运作...

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

于 2014-01-13T13:08:17.070 回答
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>

网络配置

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

默认.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!
于 2013-09-16T16:35:14.273 回答
2

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

using System.Web.Configuration;

所以,要访问 appSettings 的

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

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

希望这可以帮助。

于 2014-02-13T17:47:43.807 回答
0

或许值得一提的是,Web.config这些connectionStrings/@configSourceappSettings/@file相对于项目目录(不是目标目录)。这让我有一段时间。

于 2020-03-02T00:36:37.403 回答