我如何定义自定义web.config部分与属性的潜在子元素和属性?

我开发的Web应用程序通常需要相互依赖的configuration设置,而且在我们每个环境之间移动时,还必须更改设置。

我们所有的设置都是简单的键值对,但是创build自定义的configuration部分会非常有用,因此当两个值需要一起更改或需要更改某个环境的设置时很明显。

创build自定义configuration部分的最佳方法是什么?在检索值时是否需要特别考虑?

使用属性,子configuration节和约束

也有可能使用自动照顾pipe道的属性,以及提供容易添加约束的能力。

我在这里给出了一个例子,我在我的一个站点中使用自己的代码。 有了一个约束,我决定允许一个用户允许使用的最大磁盘空间量。

MailCenterConfiguration.cs:

namespace Ani { public sealed class MailCenterConfiguration : ConfigurationSection { [ConfigurationProperty("userDiskSpace", IsRequired = true)] [IntegerValidator(MinValue = 0, MaxValue = 1000000)] public int UserDiskSpace { get { return (int)base["userDiskSpace"]; } set { base["userDiskSpace"] = value; } } } } 

这是在web.config中设置的

 <configSections> <!-- Mailcenter configuration file --> <section name="mailCenter" type="Ani.MailCenterConfiguration" requirePermission="false"/> </configSections> ... <mailCenter userDiskSpace="25000"> <mail host="my.hostname.com" port="366" /> </mailCenter> 

子元素

子xml元素邮件是在与上面相同的.cs文件中创build的。 这里我在端口上添加了限制。 如果端口被分配了一个不在这个范围内的值,运行时会在configuration加载时发出抱怨。

MailCenterConfiguration.cs:

 public sealed class MailCenterConfiguration : ConfigurationSection { [ConfigurationProperty("mail", IsRequired=true)] public MailElement Mail { get { return (MailElement)base["mail"]; } set { base["mail"] = value; } } public class MailElement : ConfigurationElement { [ConfigurationProperty("host", IsRequired = true)] public string Host { get { return (string)base["host"]; } set { base["host"] = value; } } [ConfigurationProperty("port", IsRequired = true)] [IntegerValidator(MinValue = 0, MaxValue = 65535)] public int Port { get { return (int)base["port"]; } set { base["port"] = value; } } 

使用

为了在代码中实际使用它,您只需要实例化MailCenterConfigurationObject,它将自动从web.config中读取相关部分。

MailCenterConfiguration.cs

 private static MailCenterConfiguration instance = null; public static MailCenterConfiguration Instance { get { if (instance == null) { instance = (MailCenterConfiguration)WebConfigurationManager.GetSection("mailCenter"); } return instance; } } 

AnotherFile.cs

 public void SendMail() { MailCenterConfiguration conf = MailCenterConfiguration.Instance; SmtpClient smtpClient = new SmtpClient(conf.Mail.Host, conf.Mail.Port); } 

检查有效性

我之前提到,运行时会在configuration加载时发生抱怨,而有些数据不符合您设置的规则(例如在MailCenterConfiguration.cs中)。 当我的网站启动时,我倾向于尽快知道这些事情。 解决这个问题的一个方法是在_Global.asax.cx.Application_Start_中加载configuration,如果configuration无效,将会以exception方式通知您。 您的网站将无法启动,您将在黄色的死亡屏幕上呈现详细的例外信息。

的Global.asax.cs

 protected void Application_ Start(object sender, EventArgs e) { MailCenterConfiguration.Instance; } 

快速肮脏:

首先创build你的ConfigurationSectionConfigurationElement类:

 public class MyStuffSection : ConfigurationSection { ConfigurationProperty _MyStuffElement; public MyStuffSection() { _MyStuffElement = new ConfigurationProperty("MyStuff", typeof(MyStuffElement), null); this.Properties.Add(_MyStuffElement); } public MyStuffElement MyStuff { get { return this[_MyStuffElement] as MyStuffElement; } } } public class MyStuffElement : ConfigurationElement { ConfigurationProperty _SomeStuff; public MyStuffElement() { _SomeStuff = new ConfigurationProperty("SomeStuff", typeof(string), "<UNDEFINED>"); this.Properties.Add(_SomeStuff); } public string SomeStuff { get { return (String)this[_SomeStuff]; } } } 

然后让框架知道如何处理web.config中的configuration类:

 <configuration> <configSections> <section name="MyStuffSection" type="MyWeb.Configuration.MyStuffSection" /> </configSections> ... 

并且实际上在下面添加您自己的部分

  <MyStuffSection> <MyStuff SomeStuff="Hey There!" /> </MyStuffSection> 

那么你可以在你的代码中使用它:

 MyWeb.Configuration.MyStuffSection configSection = ConfigurationManager.GetSection("MyStuffSection") as MyWeb.Configuration.MyStuffSection; if (configSection != null && configSection.MyStuff != null) { Response.Write(configSection.MyStuff.SomeStuff); } 

在MSDN上,使用ConfigurationCollection和.NET 4.5为web.config中的自定义部分提供了一个很好的示例,它具有configuration项列表。

自定义configuration非常方便,通常应用程序最终需要一个可扩展的解决scheme。

对于.NET 1.1请参考文章http://aspnet.4guysfromrolla.com/articles/020707-1.aspx

注意:上面的解决scheme也适用于.NET 2.0。

对于.NET 2.0特定的解决scheme,请参考文章http://aspnet.4guysfromrolla.com/articles/032807-1.aspx

你可以用Section Handlers完成这个。 在http://www.codeproject.com/KB/aspnet/ConfigSections.aspx上有一个基本的概述,但是它指的是app.config,它和编写一个web应用程序非常相似。configuration。; 这将允许您在configuration文件中拥有自己的XML树,并执行一些更高级的configuration。

我发现最简单的方法是使用appSettings部分 。

  1. 添加到Web.config如下:

     <appSettings> <add key="MyProp" value="MyVal"/> </appSettings> 
  2. 从您的代码访问

     NameValueCollection appSettings = ConfigurationManager.AppSettings; string myPropVal = appSettings["MyProp"];