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

sut 发布于 2018-02-09 asp.net 最后更新 2018-02-09 01:07 990 浏览

我开发的Web应用程序通常需要相互依赖的配置设置,而且在我们每个环境之间移动时,还必须更改设置。 我们所有的设置都是简单的键值对,但是创建自定义的配置部分会非常有用,这样当两个值需要一起更改或者需要更改某个环境的设置时,这是非常有用的。 创建自定义配置部分的最佳方法是什么?在检索值时是否需要特别考虑?

已邀请:

aet

赞同来自:

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

aeius

赞同来自:

快速肮脏: 首先创建您的 ConfigurationSection ConfigurationElement 类:

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

sit_in

赞同来自:

使用属性,子配置节和约束 也有可能使用自动照顾管道的属性,以及提供容易添加约束的能力。 我在这里给出了一个例子,我在我的一个站点中使用自己的代码。有了一个约束,我决定允许一个用户允许使用的最大磁盘空间量。 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元素 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_中加载配置,如果配置无效,将会以异常方式通知您。您的网站将无法启动,而您将在Yellow screen of death中显示详细的例外信息。 的Global.asax.cs
protected void Application_ Start(object sender, EventArgs e)
{
    MailCenterConfiguration.Instance;
}

funde

赞同来自:

自定义配置非常方便,通常应用程序最终需要一个可扩展的解决方案。 对于.NET 1.1,请参阅文章http://aspnet.4guysfromrolla.com/articles/020707-1.aspx 注意:上面的解决方案也适用于.NET 2.0。 对于.NET 2.0特定的解决方案,请参阅文章http://aspnet.4guysfromrolla.com/articles/032807-1.aspx

ynulla

赞同来自:

有一个很棒的example on MSDN,使用ConfigurationCollection和.NET 4.5作为web.config中的自定义部分,它有一个配置项列表。

ha

赞同来自:

我发现最简单的方法是使用appSettings section

  1. 添加到Web.config中:
    <appSettings>
        <add key="MyProp" value="MyVal"/>
    </appSettings>
    
    从您的代码访问
  2. NameValueCollection appSettings = ConfigurationManager.AppSettings;
    string myPropVal = appSettings["MyProp"];