65.9K
CodeProject 正在变化。 阅读更多。
Home

将自定义配置节添加到单独的 web.config

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.91/5 (6投票s)

2008年5月8日

CPOL

3分钟阅读

viewsIcon

166524

downloadIcon

343

本文介绍了一种将自定义配置节添加到“另一个” web.config 中的技巧

引言

添加自定义配置节允许您利用内置的 .NET 配置机制,使用强类型对象访问配置内容 而无需处理 XML1, 2。本文介绍了一种关于如何在“另一个” web.config 中添加自定义配置节的技巧,同时又不会失去在位于 Web 应用程序根目录的 web.config 中所具有的支持。

背景

不久前,我在这个 论坛帖子中提出了一个问题,关于如何将我定义的配置节放入其他文件中以便轻松管理配置内容。可以很容易地想象,web.config 已经定义了大量的配置节;将我自己的自定义配置节添加到它上面会进一步使它的结构变得混乱。

我收到了一条回复,关于将 <appSettings> 节扩展到其他文件,但这还不够,因为我的许多设置应该在逻辑上组织为单独的节。这个问题似乎尚未解决(至少基于谷歌搜索),因此我想与您分享我的解决方法。

实现

调用 WebConfigurationManager.OpenWebConfiguration 将返回一个 Configuration 实例,您可以通过它检索 web.config 中的各种节。您可以使用它打开指定目录下的 web.config,例如 MyConfig(图 1),如清单 1 所示。System.Web.Hosting.HostingEnvironment.ApplicationVirtualPath 将被替换为您的 Web 应用程序根目录的相对路径,例如 /WebApp1

图 1. 将 web.config 放置到指定目录


清单 1. 在指定目录下打开 web.config

Configuration config = WebConfigurationManager.OpenWebConfiguration
    (System.Web.Hosting.HostingEnvironment.ApplicationVirtualPath + "/MyConfig");

为了试验在 MyConfig 目录下加载 web.config 的行为,两个设置项被添加到 <appSettings> 中,如清单 2 所示。并且在根目录下的 web.config<appSettings> 中有两个设置,如清单 3 所示。使用调试器观察清单 1 中的 config 变量,我们可以观察到 config.AppSettings.Settings 中有四个设置项(图 2)。换句话说,MyConfig 目录下的 web.config 的内容将被合并到根目录下的默认文件中。因此,我推测我们可以在单独的 web.config 中定义我们的自定义节。

清单 2. MyConfig 目录下的 web.config 的 <appSettings>

<appSettings>
<add key="3" value="c"/>
<add key="4" value="d"/>
</appSettings>

清单 3. 根目录下的 web.config 的 <appSettings>

<appSettings>
<add key="1" value="a"/>
<add key="2" value="b"/>
</appSettings>

图 2. AppSettings 的数量

借用“如何:使用 ConfigurationSection 创建自定义配置节1 中的示例代码,我们在 MyConfig 下的 web.config 中添加一个 myCustomSection 节,如清单 4 所示,并在 App_Code 中创建 MyHandler 类,以便我们可以使用此类访问此节,如清单 5 所示。GetSection 方法允许您检索由指定节表示的实例。如果您不明白我在说什么,请参阅参考资料。

清单 4. MyConfig 下 web.config 中的自定义节

<myCustomGroup>
<myCustomSection myAttrib1="Clowns">
        <myChildSection myChildAttrib1="Zippy" myChildAttrib2="Michael Zawondy "/>
        </ myCustomSection>
</myCustomGroup>

清单 5. 检索 myCustomSection 节

Configuration config =  WebConfigurationManager.OpenWebConfiguration
    (System.Web.Hosting.HostingEnvironment.ApplicationVirtualPath + "/MyConfig");
MyConfigSectionHandler.MyHandler myHandler =  
    (MyConfigSectionHandler.MyHandler)config.GetSection("myCustomGroup/myCustomSection");

现在让我们使用调试器来证明这个想法。如图 3 所示,在清单 4 中定义的配置内容成为 myHandler 的子属性。您可以将 MyChildAttribute1 更改为某个值,例如“Ooo”,然后调用 config.Save() 以更新 MyChildAttribute1 MyConfig 下的 web.config 中的值。非常方便!

图 3. 调试 myHander 变量

结论

在本文中,我们介绍了一种技巧,让您可以将自定义配置放入单独的 web.config 中,而不会失去 .NET 配置框架的支持。从我的角度来看,唯一的限制是您必须将配置文件命名为 web.config,这可能不合适,因此您无法将其放置在 Web 应用程序的根目录下。

参考

  1. 如何:使用 ConfigurationSection 创建自定义配置节
  2. 自定义配置节,仅需 3 个简单步骤
  3. 从 Web.Config 引用外部配置文件

历史

  • 2008 年 5 月 8 日:最初发布
© . All rights reserved.