¿Cómo defino secciones web.config personalizadas con posibles elementos secundarios y atributos para las propiedades?

StackOverflow https://stackoverflow.com/questions/2155

  •  08-06-2019
  •  | 
  •  

Pregunta

Las aplicaciones web que desarrollo a menudo requieren ajustes de configuración codependientes y también hay ajustes que deben cambiar a medida que nos movemos entre cada uno de nuestros entornos.

Actualmente, todas nuestras configuraciones son pares clave-valor simples, pero sería útil crear secciones de configuración personalizadas para que sea obvio cuándo es necesario cambiar dos valores juntos o cuándo es necesario cambiar la configuración para un entorno.

¿Cuál es la mejor manera de crear secciones de configuración personalizadas? ¿Hay que tener en cuenta alguna consideración especial al recuperar los valores?

¿Fue útil?

Solución

Uso de atributos, secciones de configuración secundaria y restricciones

También existe la posibilidad de utilizar atributos que se ocupan automáticamente de la plomería, además de brindar la posibilidad de agregar restricciones fácilmente.

Aquí presento un ejemplo del código que uso en uno de mis sitios.Con una restricción, dicto la cantidad máxima de espacio en disco que cualquier usuario puede 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; }
        }
    }
}

Esto está configurado en web.config así

<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 secundarios

El elemento xml hijo correo se crea en el mismo archivo .cs que el anterior.Aquí agregué restricciones en el puerto.Si al puerto se le asigna un valor que no está en este rango, el tiempo de ejecución se quejará cuando se cargue la configuración.

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 luego usarlo prácticamente en código, todo lo que tienes que hacer es crear una instancia del MailCenterConfigurationObject, esto automáticamente lea las secciones relevantes de web.config.

MailCenterConfiguration.cs

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

        return instance;
    }
}

OtroArchivo.cs

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

Verificar validez

Anteriormente mencioné que el tiempo de ejecución se quejará cuando se cargue la configuración y algunos datos no cumplan con las reglas que ha configurado (p. ej.en MailCenterConfiguration.cs).Tiendo a querer saber estas cosas lo antes posible cuando mi sitio se inicia.Una forma de resolver esto es cargar la configuración en _Global.asax.cx.Application_Start_, si la configuración no es válida, se le notificará mediante una excepción.Su sitio no se iniciará y en su lugar se le presentará información detallada sobre la excepción en el Pantalla amarilla de la muerte.

Global.asax.cs

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

Otros consejos

Rápido y sucio:

Primero crea tu Sección de configuración y Elemento de configuración clases:

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

Luego, deje que el marco sepa cómo manejar sus clases de configuración en web.config:

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

Y, de hecho, agregue su propia sección a continuación:

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

Entonces puedes usarlo en tu código así:

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

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

Hay una excelente ejemplo en MSDN usando ConfigurationCollection y .NET 4.5 para secciones personalizadas en web.config que tiene una lista de elementos de configuración.

La configuración personalizada es algo bastante útil y, a menudo, las aplicaciones terminan con la demanda de una solución ampliable.

Para .NET 1.1, consulte el artículo http://aspnet.4guysfromrolla.com/articles/020707-1.aspx

Nota:La solución anterior también funciona para .NET 2.0.

Para una solución específica de .NET 2.0, consulte el artículo http://aspnet.4guysfromrolla.com/articles/032807-1.aspx

Puede lograr esto con los controladores de sección.Hay una descripción básica de cómo escribir uno en http://www.codeproject.com/KB/aspnet/ConfigSections.aspx sin embargo, se refiere a app.config, que sería prácticamente lo mismo que escribir uno para usar en web.config.Esto le permitirá esencialmente tener su propio árbol XML en el archivo de configuración y realizar una configuración más avanzada.

El método más simple que encontré es usar sección de configuración de la aplicación.

  1. Agregue a Web.config lo siguiente:

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

  2. Accede desde tu código

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top