【问题标题】:External AppSettings File NOT merging with web.config外部 AppSettings 文件未与 web.config 合并
【发布时间】:2013-09-20 20:32:54
【问题描述】:

在我的应用程序中,我有一个带有 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 中的非工作密钥正下方时,它们似乎是相同的。我希望在配置文件合并错误的情况下必须有某种方法来引发错误?

【问题讨论】:

  • 随机想到:在您的外部文件中,您可以尝试使用 元素,看看它是否可以删除主文件中定义的键。如果是这样,请尝试删除,然后在外部文件中添加密钥。

标签: asp.net web-config


【解决方案1】:

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

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

【讨论】:

  • 感谢您推荐检查构建操作,您刚刚避免了我头上的一些头发被拔出。
  • 加一个用于“始终复制”设置,例如右键单击解决方案资源管理器中的文件并选择设置,然后将“复制本地”设置设置为“始终复制”或“更新时复制”。
  • “抄袭”拯救了我的一天。谢谢。
【解决方案2】:

我能够确认外部 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>
...

默认.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!

【讨论】:

  • 谢谢!一般来说,我知道这与您测试过的完全一样。我的问题更多是关于事物的失败合并方面。有些东西是错的,但我真的不知道它是错的。没有什么告诉我它不是,除了设置控制的行为是错误的。能够捕获任何错误,并通知某人,比如说,这里可能存在配置错误..语法错误,xml错误等......而不是删除和重新添加,并且神奇地拥有它再次开始工作。我很高兴它起作用了,但我想知道为什么它不起作用!
  • 有趣...对于我从头开始创建的项目,如果外部配置中有错误的文本,我确实会收到一个错误页面。您使用的是什么版本的 .net 和 Visual Studio?
【解决方案3】:

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

using System.Web.Configuration;

所以,要访问 appSettings 的

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

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

希望这会有所帮助。

【讨论】:

  • 当我使用这种语法时,我得到“System.ArgumentException: '应用程序相对虚拟路径'~/'在这里不允许。'”。
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 2012-07-31
    • 1970-01-01
    • 2011-11-01
    • 1970-01-01
    • 2013-05-09
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多