¿Cómo puedo definir secciones web.config personalizadas con elementos secundarios y atributos potenciales para las propiedades?

votos
59

Las aplicaciones web que desarrollo a menudo requieren configuraciones de configuración co-dependientes y también hay configuraciones que tienen que cambiar a medida que nos movemos entre cada uno de nuestros entornos.

Todas nuestras configuraciones son actualmente pares de valores clave simples, pero sería útil crear secciones de configuración personalizadas para que sea obvio cuando dos valores deben cambiarse juntos o cuando las configuraciones deben cambiar para un entorno.

¿Cuál es la mejor manera de crear secciones de configuración personalizadas y hay alguna consideración especial que hacer al recuperar los valores?

Publicado el 05/08/2008 a las 13:13
fuente por usuario
En otros idiomas...                            


6 respuestas

votos
2

Puede lograr esto con Section Handlers. Hay una descripción general 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 más o menos lo mismo que escribir uno para su uso en la 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.

Respondida el 05/08/2008 a las 13:25
fuente por usuario

votos
11

Quick'n Dirty:

Primero crea tus clases ConfigurationSection y 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];
        }
    }
}

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

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

Y agrega tu 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);
}
Respondida el 05/08/2008 a las 13:51
fuente por usuario

votos
74

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

También existe la posibilidad de utilizar atributos que automáticamente se ocupan de las tuberías, además de proporcionar la capacidad de agregar restricciones fácilmente.

Aquí presento un ejemplo del código que utilizo 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 como tal

<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 correo del elemento xml secundario se crea en el mismo archivo .cs que el anterior. Aquí he agregado 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; }
        }

Utilizar

Para luego usarlo prácticamente en código, todo lo que tiene que hacer es crear una instancia del MailCenterConfigurationObject, esto leerá automáticamente 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;
    }
}

AnotherFile.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 (por ejemplo, en MailCenterConfiguration.cs). Tiendo a querer saber estas cosas lo antes posible cuando mi sitio se active. 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 lo notificará con los medios de una excepción. Su sitio no comenzará y, en su lugar, se le presentará información detallada sobre excepciones en la pantalla amarilla de la muerte .

Global.asax.cs

protected void Application_ Start(object sender, EventArgs e)
{
    MailCenterConfiguration.Instance;
}
Respondida el 05/08/2008 a las 23:17
fuente por usuario

votos
3

La configuración personalizada es bastante práctica y, a menudo, las aplicaciones terminan demandando una solución extensible.

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 la solución específica de .NET 2.0, consulte el artículo http://aspnet.4guysfromrolla.com/articles/032807-1.aspx

Respondida el 13/02/2009 a las 14:45
fuente por usuario

votos
4

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

Respondida el 19/09/2013 a las 16:39
fuente por usuario

votos
1

El método más simple, que he encontrado, está usando la sección de appSettings .

  1. Añadir a Web.config lo siguiente:

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

  2. El acceso desde el código

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

Respondida el 04/02/2017 a las 14:59
fuente por usuario

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