Lectura de la configuración de app.config o web.config en .NET

Estoy trabajando en una biblioteca de clases C # que necesita poder leer la configuración de la web.config or app.config archivo (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 usar:

ConfigurationManager.AppSettings["MySetting"]

Sin embargo, a pesar de la System.Configuration.ConfigurationManager class no parece estar disponible en un proyecto de biblioteca de clases de C #.

¿Cuál es la mejor manera de hacer esto?

preguntado el 27 de julio de 09 a las 13:07

Como si leí 4 ejemplos y artículos de MSDN ... Y aterricé aquí. Solo agregue una referencia ... ¿por qué no pueden simplemente decir eso? ¡Buena pregunta! +1 -

Si deseas escribir la configuración de nuevo también, mira aquí cómo puedes hacerlo. -

25 Respuestas

Necesitarás agregar una referencia a System.Configuration en tu proyecto carpeta de referencias.

Definitivamente deberías usar el ConfigurationManager sobre lo obsoleto ConfigurationSettings.

Respondido el 02 de junio de 15 a las 19:06

¡Muchas gracias! respuesta muy sencilla. ¡Estaba creando una aplicación de consola! y esta respuesta salva el día! - PatsonLeaner

¿Sigue siendo exacto para .net core? - Triynko

Para un archivo app.config de muestra como el siguiente:

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

Ha leído la configuración de la aplicación anterior utilizando el código que se muestra a continuación:

using System.Configuration;

Es posible que también deba agregar una referencia a System.Configuration en su proyecto si aún no hay uno. Luego puede acceder a los valores así:

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

Respondido el 27 de diciembre de 19 a las 15:12

Me gusta más tu respuesta que la respuesta aceptada. Las respuestas con ejemplos siempre me sirven. - Brendan Vogt

Esto funcionó para mí. Sin embargo, mi System.Configuration no contiene un ConfigurationManager, así que tuve que usar ConfigurationSettings. Irónicamente, todavía recibí una advertencia de que estaba obsoleto. - Juegos de pesadilla

Esto me pasó a mí también. ¿Ha intentado agregar la referencia System.Configuration? El problema es que VS te engaña haciéndote pensar que realmente lo tienes; puede usar intellisense para obtener el espacio de nombres System.Configuration pero no tiene la clase ConfigurationManager. Solo agrega la referencia y eso lo arregla. - francine degrood taylor

@Cricketheads System.Configuration contiene ConfigurationManager, es probable que le falte una referencia a System.Configuration en su proyecto. - Emigrar

¿Alguien puede decirme por qué cree que System.Configuration no se agrega de forma predeterminada ... esto parece una necesidad bastante básica en la mayoría de las aplicaciones? - Todd Vance

Actualización para .NET Framework 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;

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

Respondido el 27 de diciembre de 19 a las 16:12

Propiedades desde 2010. - Nick Westgate

Muchas gracias por publicar esto. Determiné que Properties.Settings.Default.MachName funcionó, pero no pude entender por qué ConfigurationManager.AppSettings ["MachName"] devolvió nulo. - J.Chris Compton

Esto puso fin a mi prolongada agonía. Gracias. El marco debería advertirle que la forma antigua es obsoleta. - Neil b

No puedo confirmar. ConfigurationManager.AppSettings ["someKey"] funciona en .NET 4.5, 4.6, 4.7.1 - Ivanhoe

@Ivanhoe ¿Qué versión de VisualStudio usaste? El ConfigurationManager.AppSettings ["someKey"] funcionó con 4.6.1 y VS 15.8.2 pero falló con 4.6.1 y VS 15.9.2 para mí. - kkuilla

Haga clic con el botón derecho en la biblioteca de su clase y elija la opción "Agregar referencias" del menú.

Y desde la pestaña .NET, seleccione System.Configuration. Esto incluiría el archivo DLL System.Configuration en su proyecto.

Respondido el 27 de diciembre de 19 a las 15:12

Después de agregar una referencia, pudo hacer ConfigurationManager.ConnectionStrings[0].ConnectionString - SushiGuy

Estoy usando esto y me funciona bien:

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

Respondido 24 Oct 19, 13:10

El TS declara explícitamente que usa el mismo código, pero su proyecto no se puede compilar (debido a que faltan referencias, como resultó). -1 por no leer la pregunta. - Isantipov

Leer desde la configuración:

Deberá agregar una referencia a la configuración:

  1. Abra "Propiedades" en su proyecto
  2. Ve a la pestaña "Configuración"
  3. Agregue "Nombre" y "Valor"
  4. Obtenga valor usando el siguiente código:

    string value = Properties.Settings.Default.keyname;
    

Guardar en la configuración:

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

Respondido el 27 de diciembre de 19 a las 15:12

FYI: A Google le gusta más tu respuesta. Aparece literalmente cuando busca "obtener la configuración de configuración de la aplicación c #" - Steve Gómez

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

Respondido el 27 de diciembre de 19 a las 15:12

Es posible que esté agregando el archivo App.config a un archivo DLL. App.Config funciona solo para proyectos ejecutables, ya que todos los archivos DLL toman la configuración del archivo de configuración para el archivo EXE que se está ejecutando.

Digamos que tiene dos proyectos en su solución:

  • algun dll
  • AlgúnExe

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

Respondido el 27 de diciembre de 19 a las 15:12

Vaya, eso no es obvio. Si alguien pudiera vincular un documento hablando de esto, sería fantástico. Este es un tema difícil de buscar. - David Krider

Gracias por esto. No vi esto en ninguna parte. - parámetro

Prueba esto:

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

En los web.config archivo esta debería ser la siguiente estructura:

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

Respondido el 27 de diciembre de 19 a las 15:12

Yo tuve el mismo problema. Simplemente léalos de esta manera: System.Configuration.ConfigurationSettings.AppSettings ["MySetting"]

Respondido el 27 de diciembre de 19 a las 15:12

Según Microsoft con respecto a ConfigurationSettings.AppSettings This method is obsolete, it has been replaced by System.Configuration!System.Configuration.ConfigurationManager.AppSettings - pedro m

este método es obsoleto - GabrielBB

web.config se utiliza con aplicaciones web. web.config por defecto tiene varias configuraciones requeridas para la aplicación web. Puedes tener un web.config para cada carpeta de su aplicación web.

app.config se utiliza para aplicaciones de Windows. Cuando compile la aplicación en Visual Studio, automáticamente se le cambiará el nombre a <appname>.exe.config y este archivo debe entregarse junto con su solicitud.

Puede utilizar el mismo método para llamar al app settings valores de ambos archivos de configuración: System.Configuration.ConfigurationSettings.AppSettings ["Key"]

Respondido el 27 de diciembre de 19 a las 15:12

También es posible utilizar System.Configuration.COnfigurationSettings.AppSettings.Get("Key") en lugar de utilizar los corchetes. - Albañil

Como encontré el mejor enfoque para acceder a las variables de configuración de la aplicación de una manera sistemática haciendo 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 mediante nombres codificados mediante 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
}

Respondido el 27 de diciembre de 19 a las 15:12

Esto utiliza el método que el OP señala que está marcado como obsoleto. - user2864740

Te recomiendo encarecidamente que crees un envoltura para esta llamada. Algo como un ConfigurationReaderService y use inyección de dependencia para obtener esta clase. De esta forma, podrá aislar estos archivos de configuración con fines de prueba.

Así que usa el ConfigurationManager.AppSettings["something"]; sugerido y devuelve este valor. Con este método puede crear algún tipo de retorno predeterminado si no hay ninguna clave disponible en el archivo .config.

Respondido el 27 de diciembre de 19 a las 15:12

Microsoft ya tiene una forma integrada de administrar varias versiones del mismo archivo de configuración: construir configuraciones, que permiten tener archivos de configuración separados para cada configuración de compilación: app.DEBUG.config, app.RELEASE.configy app.TEST.config, etc - jpaugh

Además, puedes usar Formulario:

Configuración:

<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>();

Respondido el 27 de diciembre de 19 a las 15:12

¿Por qué demonios querrías hacer esto? - lukejkw

Paso 1: haga clic derecho en la pestaña de referencias para agregar una referencia.

Paso 2: haga clic en la pestaña Ensamblajes

Paso 3: busque 'System.Configuration'

Paso 4: haz clic en Aceptar.

Entonces funcionará.

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

Respondido el 27 de diciembre de 19 a las 16:12

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 que se agregue una referencia adicional, por lo que puede ser preferible para algunas personas.

Respondido el 27 de diciembre de 19 a las 15:12

Siempre creo una interfaz IConfig con propiedades de seguridad de tipos declaradas para todos los valores de configuración. Luego, una clase de implementación de configuración envuelve las llamadas a System.Configuration. Todas las llamadas a System.Configuration están ahora en un solo lugar, y es mucho más fácil y limpio mantener y rastrear qué campos se están utilizando y declarar sus valores predeterminados. Escribo un conjunto de métodos auxiliares privados para leer y analizar tipos de datos comunes.

Usando año COI framework, puede acceder a los campos IConfig en cualquier lugar de su aplicación simplemente pasando la interfaz a un constructor de clases. Luego, también puede crear implementaciones simuladas de la interfaz IConfig en sus pruebas unitarias, por lo que ahora puede probar varios valores de configuración y combinaciones de valores sin necesidad de tocar su archivo App.config o Web.config.

Respondido el 27 de diciembre de 19 a las 15:12

ConfigurationManager no es lo que necesita para acceder a su propia configuración.

Para hacer esto debes usar

{YourAppName}.Properties.Settings.{settingName}

Respondido el 27 de diciembre de 19 a las 16:12

Si necesita / desea utilizar el ConfigurationManager clase...

Puede que necesite cargar System.Configuration.ConfigurationManager por Microsoft a través de Administrador de paquetes NuGet

Herramientas-> Administrador de paquetes NuGet-> Administrar paquetes NuGet para la solución ...

Microsoft Docs

Una cosa que vale la pena señalar de los documentos ...

Si su aplicación necesita acceso de solo lectura a su propia configuración, le recomendamos que utilice el método GetSection (String). Este método proporciona acceso a los valores de configuración almacenados en caché para la aplicación actual, que tiene un mejor rendimiento que la clase Configuración.

respondido 06 mar '20, 00:03

Otra posible solución:

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

respondido 30 mar '16, 16:03

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 de configuración de la aplicación en el web.config expediente. Esto debería anular el archivo .dll cuando se usa el asistente.

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

Respondido el 27 de diciembre de 19 a las 15:12

Puede utilizar la siguiente línea. En mi caso estaba funcionando: System.Configuration.ConfigurationSettings.AppSettings ["yourKeyName"]

Debe tener cuidado de que la línea de código anterior también sea la versión anterior y esté obsoleta en las bibliotecas nuevas.

Respondido el 27 de diciembre de 19 a las 16:12

Pude hacer que el siguiente enfoque funcionara para proyectos .NET Core:

Pasos:

  1. Cree un archivo appsettings.json (formato que se muestra a continuación) en su proyecto.
  2. A continuación, cree una clase de configuración. El formato se proporciona a continuación.
  3. He creado un método Login () para mostrar el uso de la clase de configuración.

    Cree appsettings.json en su proyecto con contenido:

    {
      "Environments": {
        "QA": {
          "Url": "somevalue",
     "Username": "someuser",
          "Password": "somepwd"
      },
      "BrowserConfig": {
        "Browser": "Chrome",
        "Headless": "true"
      },
      "EnvironmentSelected": {
        "Environment": "QA"
      }
    }
    
    public static class Configuration
    {
        private static IConfiguration _configuration;
    
        static Configuration()
        {
            var builder = new ConfigurationBuilder()
                .AddJsonFile($"appsettings.json");
    
            _configuration = builder.Build();
    
        }
        public static Browser GetBrowser()
        {
    
            if (_configuration.GetSection("BrowserConfig:Browser").Value == "Firefox")
            {
                return Browser.Firefox;
            }
            if (_configuration.GetSection("BrowserConfig:Browser").Value == "Edge")
            {
                return Browser.Edge;
            }
            if (_configuration.GetSection("BrowserConfig:Browser").Value == "IE")
            {
                return Browser.InternetExplorer;
            }
            return Browser.Chrome;
        }
    
        public static bool IsHeadless()
        {
            return _configuration.GetSection("BrowserConfig:Headless").Value == "true";
        }
    
        public static string GetEnvironment()
        {
            return _configuration.GetSection("EnvironmentSelected")["Environment"];
        }
        public static IConfigurationSection EnvironmentInfo()
        {
            var env = GetEnvironment();
            return _configuration.GetSection($@"Environments:{env}");
        }
    
    }
    
    
    public void Login()
    {
        var environment = Configuration.EnvironmentInfo();
        Email.SendKeys(environment["username"]);
        Password.SendKeys(environment["password"]);
        WaitForElementToBeClickableAndClick(_driver, SignIn);
    }
    

Respondido el 27 de diciembre de 19 a las 16:12

Compruebe la versión de .NET en la que está trabajando. Debe ser superior a 4. Y debe agregar la biblioteca del sistema System.Configuration a su aplicación.

Respondido el 27 de diciembre de 19 a las 16:12

Esta pregunta se hizo hace más de 9 años y ya tiene más de 20 respuestas, incluidas 2, cada una con más de 600 votos a favor, la respuesta aceptada es agregar una referencia a System.Configuration. Esta respuesta adicional no agrega valor. En el mejor de los casos, debería ser un comentario sobre la respuesta aceptada. - Richardísimo

Re "superior a 4": ¿En número de versión principal? O te refieres "superior a 4.0"? O en otras palabras, ¿de qué lado . NET Framework 4.5 ¿estar en? - Pedro Mortensen

He aquí un ejemplo: App.config

<applicationSettings>
    <MyApp.My.MySettings>
        <setting name="Printer" serializeAs="String">
            <value>1234 </value>
        </setting>
    </MyApp.My.MySettings>
</applicationSettings>

Dim strPrinterName as string = My.settings.Printer

Respondido el 27 de diciembre de 19 a las 15:12

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.