asp.net

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



(6)

El método más simple, que encontré, es usar la sección appSettings .

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

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.

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

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


Hay un 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.



Puede lograr esto con los controladores de sección. 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 casi lo mismo que escribir uno para usar en la web. config. Esto le permitirá esencialmente tener su propio árbol XML en el archivo de configuración y hacer una configuración más avanzada.


Quick''n Dirty:

Primero cree sus 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 marco sepa cómo manejar sus clases de configuración en web.config :

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

Y en realidad agregue su propia sección a continuación:

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

Entonces puede usarlo en su código de esta manera:

MyWeb.Configuration.MyStuffSection configSection = ConfigurationManager.GetSection("MyStuffSection") as MyWeb.Configuration.MyStuffSection; if (configSection != null && configSection.MyStuff != null) { Response.Write(configSection.MyStuff.SomeStuff); }


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

También existe la posibilidad de utilizar atributos que se ocupan automáticamente de la fontanería, además de proporcionar la capacidad 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 se configura 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 secundario xml mail 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 usarlo prácticamente en código, todo lo que tiene que hacer es instanciar el 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 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á esto con los medios de una excepción. Su sitio no se iniciará y, en su lugar, se le presentará información detallada de excepciones en la pantalla amarilla de la muerte .

Global.asax.cs

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