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

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

我们所有的设置都是简单的键值对,但是创建自定义配置节会很有用,这样当两个值需要一起更改或需要更改某个环境的设置时很明显。

创建自定义配置部分的最佳方式是什么?在检索值时是否有特殊注意事项?

0
额外 编辑
意见: 2

5 答案

使用属性,子配置节和约束

还可以使用自动处理管道的属性,并提供轻松添加约束的功能。

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

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中设置的


    <!-- Mailcenter configuration file -->
    
...

    

子元素

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

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);
}

检查有效性

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

的Global.asax.cs

protected void Application_ Start(object sender, EventArgs e)
{
    MailCenterConfiguration.Instance;
}
0
额外
如果您期望多个子元素,您将如何更改代码?
额外 作者 Kevin Le - Khnle,

快速肮脏:

首先创建您的 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), "");

        this.Properties.Add(_SomeStuff);
    }

    public string SomeStuff
    {
        get
        {
            return (String)this[_SomeStuff];
        }
    }
}

然后让框架知道如何在 web.config 中处理您的配置类:


  
    
  
  ...

并且在下面添加您自己的部分:

  
    
  

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

MyWeb.Configuration.MyStuffSection configSection = ConfigurationManager.GetSection("MyStuffSection") as MyWeb.Configuration.MyStuffSection;

if (configSection != null && configSection.MyStuff != null)
{
    Response.Write(configSection.MyStuff.SomeStuff);
}
0
额外

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

0
额外

有一个很好的示例在MSDN 使用 ConfigurationCollection 和.NET 4.5 for web.config中的自定义部分,它具有配置项列表。

0
额外

The most simple method, which I found, is using appSettings section.

  1. Add to Web.config the following:

    
        
    
    
  2. Access from your code

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