c# - Lectura de configuraciones desde app.config o web.config en .net


Estoy trabajando en una biblioteca de clase C # que necesita poder leer configuraciones del web.config o app.config (dependiendo de si se hace referencia a la DLL desde una aplicación web ASP.NET o una aplicación de Windows Forms).

He encontrado eso

ConfigurationSettings.AppSettings.Get("MySetting")

funciona, pero ese código ha sido marcado como obsoleto por Microsoft.

He leído que debería estar usando:

ConfigurationManager.AppSettings["MySetting"]

Sin embargo, la clase System.Configuration.ConfigurationManager no parece estar disponible desde un proyecto de Biblioteca de clases C #.

¿Alguien sabe cuál es la mejor manera de hacer esto?


Answers



Deberá agregar una referencia a System.Configuration en la carpeta de referencias de su proyecto.

Definitivamente, debe utilizar el ConfigurationManager en lugar de ConfigurationSettings obsoletos.




Para Sample App.config como a continuación:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="countoffiles" value="7" />
    <add key="logfilelocation" value="abc.txt" />
  </appSettings>
</configuration>

Usted lee la configuración de la aplicación anterior usando el código que se muestra a continuación:

using System.Configuration;

También es posible que deba agregar una referencia a System.Configuration en su proyecto si todavía no hay uno. A continuación, puede acceder a los valores de esta manera:

string configvalue1 = ConfigurationManager.AppSettings["countoffiles"];
string configvalue2 = ConfigurationManager.AppSettings["logfilelocation"];

¡Espero que esto ayude!




Actualización para el marco 4.5 y 4.6; lo siguiente ya no funcionará:

string keyvalue=System.Configuration.ConfigurationManager.AppSettings["keyname"];

Ahora acceda a la clase Configuración a través de Propiedades:

string keyvalue= Properties.Settings.Default.keyname;

Consulte Administrar la configuración de la aplicación para obtener más información.




Haga clic derecho en la biblioteca de su clase, y elija la opción "Agregar referencias" del menú; y finalmente desde la pestaña .NET, seleccione System.Configuration. Esto incluiría System.Configuration dll en su proyecto.




Estoy usando esto y me funciona bien

textBox1.Text = ConfigurationManager.AppSettings["Name"];



Debe agregar al proyecto una referencia al ensamblaje System.Configuration.




Es posible que esté agregando el archivo App.config a una DLL. App.Config funciona solo para proyectos ejecutables, ya que todos los dll toman la configuración del archivo de configuración para el ejecutable ejecutado.

Supongamos que tiene dos proyectos en su solución:

  • SomeDll
  • SomeExe

Su problema podría estar relacionado con el hecho de que está incluyendo la aplicación.config en SomeDLL y no en SomeExe. SomeDll puede leer la configuración del proyecto SomeExe.




Prueba esto:

string keyvalue=System.Configuration.ConfigurationManager.AppSettings["keyname"];

En web.config debe ser la siguiente estructura:

<configuration>
<appSettings>
<add key="keyname" value="keyvalue" />
</appSettings>
</configuration>



Tuve el mismo problema, solo léelos de esta manera:

System.Configuration.ConfigurationSettings.AppSettings["MySetting"]



Leer desde la configuración:

Deberá agregar una referencia a Config

  1. Abra "Propiedades" en su proyecto
  2. Ir a la pestaña "Configuración"
  3. Agregar "Nombre" y "Valor"
  4. Obtenga valor con el uso del siguiente código:

    string value = Properties.Settings.Default.keyname;

Guardar en Config:

   Properties.Settings.Default.keyName = value;
   Properties.Settings.Default.Save();



Recomiendo encarecidamente que cree un Contenedor para esta llamada. Algo así como un ConfigurationReaderService y usa la inyección de dependencia para obtener esta clase. De esta manera, podrá aislar estos archivos de configuración para fines de prueba.

Entonces use ConfigurationManager.AppSettings["something"]; sugirió y devuelve este valor. Con este método puede crear algún tipo de retorno predeterminado si no hay una clave disponible en el archivo .config.




Además, puedes usar Formo :

Config:

<appSettings>
    <add key="RetryAttempts" value="5" />
    <add key="ApplicationBuildDate" value="11/4/1999 6:23 AM" />
</appSettings>

Código:

dynamic config = new Configuration();
var retryAttempts1 = config.RetryAttempts;                 // returns 5 as a string
var retryAttempts2 = config.RetryAttempts(10);             // returns 5 if found in config, else 10
var retryAttempts3 = config.RetryAttempts(userInput, 10);  // returns 5 if it exists in config, else userInput if not null, else 10
var appBuildDate = config.ApplicationBuildDate<DateTime>();



Como encontré el mejor enfoque para acceder a las variables de configuración de la aplicación de manera sistemática al crear una clase contenedora sobre System.Configuration como se muestra a continuación

public class BaseConfiguration
    {
        protected static object GetAppSetting(Type expectedType, string key)
        {
            string value = ConfigurationManager.AppSettings.Get(key);
            try
            {
                if (expectedType == typeof(int))
                    return int.Parse(value);
                if (expectedType == typeof(string))
                    return value;

                throw new Exception("Type not supported.");
            }
            catch (Exception ex)
            {
                throw new Exception(string.Format("Config key:{0} was expected to be of type {1} but was not.",
                    key, expectedType), ex);
            }
        }
    }

Ahora podemos acceder a las variables de configuración necesarias por nombres codificados usando otra clase como se muestra a continuación

public class ConfigurationSettings:BaseConfiguration
    {
        #region App setting

        public static string ApplicationName
        {
            get { return (string)GetAppSetting(typeof(string), "ApplicationName"); }
        }

        public static string MailBccAddress
        {
            get { return (string)GetAppSetting(typeof(string), "MailBccAddress"); }
        }

        public static string DefaultConnection
        {
            get { return (string)GetAppSetting(typeof(string), "DefaultConnection"); }
        }

        #endregion App setting

        #region global setting



        #endregion global setting
    }



web.config se usa con aplicaciones web. web.config tendrá de forma predeterminada varias configuraciones requeridas para la aplicación web. Puede tener un web.config para cada carpeta en su aplicación web.

app.config se usa para aplicaciones de Windows. Cuando construya la aplicación en vs.net, se cambiará de nombre automáticamente a <appname>.exe.config y este archivo se entregará junto con su aplicación.

Puede usar el mismo método para llamar los valores de app settings la app settings desde ambos archivos de configuración:

System.Configuration.COnfigurationSettings.AppSettings["Key"]



He estado tratando de encontrar una solución para este mismo problema durante un par de días. Pude resolver esto agregando una clave dentro de la etiqueta appsettings en web.config. Esto debería anular el .dll cuando se usa el helper.

<configuration>
<appSettings>
<add key="loginUrl" value="~/RedirectValue.cshtml" />
<add key="autoFormsAuthentication" value="false"/>
</appSettings>
</configuration>



Siempre creo una interfaz IConfig con propiedades de seguridad para todos los valores de configuración. Una clase de implementación de configuración luego envuelve las llamadas a System.Configuration. Todas las llamadas a System.Configuration están ahora en un lugar mucho más sencillo y más limpio para mantener y rastrear qué campos se están utilizando y declarar sus valores predeterminados. Escribo un conjunto de métodos de ayuda privada para leer y analizar tipos de datos comunes.

Utilizando un marco IoC, puede acceder a los campos IConfig desde cualquier lugar en su aplicación simplemente pasando la interfaz a un constructor de clase. También puede crear implementaciones simuladas de la interfaz IConfig en las pruebas de su unidad, de modo que ahora puede probar varios valores de configuración y combinaciones de valores sin necesidad de tocar su archivo App.config o Web.config.




Solo para completar, hay otra opción disponible solo para proyectos web:

System.Web.Configuration.WebConfigurationManager.AppSettings["MySetting"]

El beneficio de esto es que no requiere una referencia adicional para ser agregado, por lo que puede ser preferible para algunas personas.




Otra posible solución:

var MyReader = new System.Configuration.AppSettingsReader();
string keyvalue = MyReader.GetValue("keyalue",typeof(string)).ToString();



por ejemplo:

<applicationSettings>
        <MyApp.My.MySettings>
            <setting name="Printer" serializeAs="String">
                <value>1234 </value>
            </setting>
        </MyApp.My.MySettings>
    </applicationSettings>
Dim strPrinterName as string= My.settings.Printer