在我的应用中,我有一个带有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中的非工作键的正下方时,它们似乎是相同的。我希望在配置文件合并错误的情况下必须有某种方法来抛出错误吗?
答案 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/@configSource
和appSettings/@file
相对于 project 目录(不是目标目录)。那有我一段时间了。