Como faço para definir seções web.config personalizados com potenciais elementos filho e atributos para as propriedades?

votos
59

As aplicações web que desenvolvo muitas vezes exigem definições de configuração co-dependentes e também há configurações que têm de mudar à medida que se deslocar entre cada um dos nossos ambientes.

Todas as nossas configurações Atualmente pares de valores-chave simples, mas seria útil para criar seções de configuração personalizada de modo que é óbvio quando dois valores precisam mudar juntos ou quando as configurações precisa mudar para um ambiente.

Qual é a melhor maneira de criar seções de configuração personalizados e existem quaisquer considerações especiais para tornar ao recuperar os valores?

Publicado 05/08/2008 em 13:13
fonte usuário
Em outras línguas...                            


6 respostas

votos
74

Usando atributos, seções de configuração criança e restrições

Há também a possibilidade de usar atributos que automaticamente cuida do encanamento, bem como proporcionar a capacidade de facilmente adicionar restrições.

Eu aqui apresentamos um exemplo de código que eu me usar em um dos meus sites. Com uma restrição I ditar a quantidade máxima de espaço em disco qualquer usuário tem permissão para usar.

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

Isto é definido em web.config como assim

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

elementos filho

O elemento xml criança correio é criado no mesmo arquivo .cs como o descrito acima. Aqui eu adicionei restrições na porta. Se a porta é atribuído um valor não nesta gama o tempo de execução reclamar quando a configuração está carregado.

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

Usar

Para usá-lo praticamente em código, tudo que você tem a fazer é instanciar o MailCenterConfigurationObject, isto irá automaticamente leia as secções relevantes do 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);
}

Verificar a validade

Eu já mencionei que o tempo de execução vai reclamar quando a configuração é carregado e alguns dados não esteja em conformidade com as regras que você configurou (por exemplo, em MailCenterConfiguration.cs). I tendem a querer saber essas coisas o mais rápido possível quando o meu site dispara para cima. Uma maneira de resolver isso é carregar a configuração em _Global.asax.cx.Application_Start_, se a configuração é inválido você será notificado sobre isso com os meios de uma exceção. Seu site não será iniciado e, em vez você será apresentado informações de exceção detalhada na tela amarela da morte .

Global.asax.cs

protected void Application_ Start(object sender, EventArgs e)
{
    MailCenterConfiguration.Instance;
}
Respondeu 05/08/2008 em 23:17
fonte usuário

votos
11

Quick'n sujo:

Primeiro crie seus ConfigurationSection e ConfigurationElement classes:

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

Então deixe o quadro saber como lidar com suas classes de configuração no web.config :

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

E realmente adicionar sua própria seção abaixo:

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

Em seguida, você pode usá-lo em seu código assim:

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

if (configSection != null && configSection.MyStuff != null)
{
    Response.Write(configSection.MyStuff.SomeStuff);
}
Respondeu 05/08/2008 em 13:51
fonte usuário

votos
4

Há um excelente exemplo no MSDN usando ConfigurationCollectione .NET 4.5 para seções personalizadas em web.config que tem uma lista de itens de configuração.

Respondeu 19/09/2013 em 16:39
fonte usuário

votos
3

A configuração personalizada são coisa bastante útil e muitas vezes aplicações acabar com uma demanda por uma solução extensível.

Para .NET 1.1, consulte o artigo http://aspnet.4guysfromrolla.com/articles/020707-1.aspx

Nota: A solução acima funciona para .NET 2.0 bem.

Para solução específica .NET 2.0, consulte o artigo http://aspnet.4guysfromrolla.com/articles/032807-1.aspx

Respondeu 13/02/2009 em 14:45
fonte usuário

votos
2

Você pode fazer isso com seção de manipuladores. Há uma visão geral básica de como escrever um em http://www.codeproject.com/KB/aspnet/ConfigSections.aspx no entanto, refere-se a app.config que seria praticamente o mesmo que escrever um para uso na web. configuração. Isto irá permitir que você essencialmente tem sua própria árvore de XML no arquivo de configuração e fazer alguma configuração mais avançada.

Respondeu 05/08/2008 em 13:25
fonte usuário

votos
1

O método mais simples, que eu encontrei, está usando a seção appSettings .

  1. Adicionar a Web.config o seguinte:

    <appSettings>
        <add key="MyProp" value="MyVal"/>
    </appSettings>
    

  2. Acesso a partir de seu código

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

Respondeu 04/02/2017 em 17:59
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more