Configuración de lectura desde app.config o web.config en .NET

807

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

He encontrado que

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, el System.Configuration.ConfigurationManager clase no parece estar disponible en un proyecto de biblioteca de clases C #.

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

Russ Clark
fuente
48
Al igual que leí 4 ejemplos y artículos de MSDN ... Y aterricé aquí. Solo agregue una referencia ... ¿por qué no pueden decir eso? ¡Buena pregunta! +1
Piotr Kula
1
Si también desea volver a escribir la configuración , mire aquí cómo puede hacerlo.
Matt

Respuestas:

798

Deberá agregar una referencia a System.Configurationla carpeta de referencias de su proyecto .

Definitivamente deberías estar usando ConfigurationManagerlo obsoleto ConfigurationSettings.

womp
fuente
¡Muchas gracias! Respuesta muy directa. ¡Estaba construyendo una aplicación de consola! y esta respuesta salva el día!
PatsonLeaner
1
¿Sigue siendo preciso para el núcleo .net?
Triynko
869

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>

Usted lee 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.Configurationsu proyecto si aún no hay una. Luego puede acceder a los valores de esta manera:

string configvalue1 = ConfigurationManager.AppSettings["countoffiles"];
string configvalue2 = ConfigurationManager.AppSettings["logfilelocation"];
RAM
fuente
124
Me gusta su respuesta más que la respuesta aceptada. Las respuestas con ejemplos siempre hacen el truco para mí.
Brendan Vogt
Esto funcionó para mí. Sin embargo, mi System.Configuration no contiene un ConfigurationManager, por lo que tuve que usar ConfigurationSettings. Irónicamente, todavía recibí una advertencia de que estaba obsoleto.
Nightmare Games
13
Esto me pasó a mí también. ¿Has intentado agregar la referencia System.Configuration? El problema es que VS te engaña haciéndote creer que realmente lo tienes; puede usar intellisense para obtener el espacio de nombres System.Configuration pero no tiene la clase ConfigurationManager. Simplemente agregue la referencia y eso lo arregla.
Francine DeGrood Taylor
3
@Cricketheads System.Configuration contiene ConfigurationManager, es probable que le falte una referencia a System.Configuration en su proyecto.
TreK
2
¿Puede alguien decirme por qué piensan 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 el
89

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 de Configuración a través de Propiedades:

string keyvalue = Properties.Settings.Default.keyname;

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

bsivel
fuente
1
Propiedades desde 2010 .
Nick Westgate
1
Muchas gracias por publicar esto. Determiné que Properties.Settings.Default.MachName funcionaba, pero no pude entender por qué ConfigurationManager.AppSettings ["MachName"] devolvió nulo.
J. Chris Compton
1
Esto puso fin a mi prolongada agonía. Gracias. El marco debe advertirle que la antigua forma es obsoleta.
Neil B
77
No puedo confirmar ConfigurationManager.AppSettings ["someKey"] funciona en .NET 4.5, 4.6, 4.7.1
Ivanhoe
1
@Ivanhoe ¿Qué versión de VisualStudio usaste? 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 el
37

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

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

Shiva
fuente
Después de agregar referencia, pude hacerConfigurationManager.ConnectionStrings[0].ConnectionString
SushiGuy
29

Estoy usando esto, y funciona bien para mí:

textBox1.Text = ConfigurationManager.AppSettings["Name"];
Pagey
fuente
48
El TS declara explícitamente que usa el mismo código, pero su proyecto no puede compilarse (debido a la falta de referencias, como resultó). -1 por no leer la pregunta.
Isantipov
23

Leer de la configuración:

Deberá agregar una referencia a la configuración:

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

    string value = Properties.Settings.Default.keyname;

Guardar en la configuración:

   Properties.Settings.Default.keyName = value;
   Properties.Settings.Default.Save();
Masoud Siahkali
fuente
1
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 Gomez
21

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

Otávio Décio
fuente
18

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:

  • SomeDll
  • SomeExe

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

Victor Naranjo
fuente
Wow, 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 declarado en ninguna parte.
parámetro
10

Prueba esto:

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

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

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

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

Tom
fuente
44
Según Microsoft con respecto a ConfigurationSettings.AppSettingsThis method is obsolete, it has been replaced by System.Configuration!System.Configuration.ConfigurationManager.AppSettings
Peter M
2
este método es obsoleto
GabrielBB
7

web.configse usa con aplicaciones web. web.configpor defecto tiene varias configuraciones requeridas para la aplicación web. Puede tener un web.configpara cada carpeta en su aplicación web.

app.configse usa para aplicaciones de Windows. Cuando cree la aplicación en Visual Studio, se le cambiará el nombre automáticamente <appname>.exe.configy este archivo debe entregarse junto con su aplicación.

Puede usar el mismo método para llamar a los app settingsvalores de ambos archivos de configuración: System.Configuration.ConfigurationSettings.AppSettings ["Key"]

Wavare Santosh
fuente
También es posible usar en System.Configuration.COnfigurationSettings.AppSettings.Get("Key")lugar de usar los corchetes.
Mason
7

Como encontré el mejor enfoque para acceder a las variables de configuración de la aplicación de manera sistemática al hacer una clase de contenedor sobre el sistema.

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 utilizando 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
}
Ashwini Jindal
fuente
Esto utiliza el método que el OP señala está marcado como obsoleto.
usuario2864740
4

Le recomiendo que cree un contenedor para esta llamada. Algo así como ay ConfigurationReaderServiceuse la inyección de dependencia para obtener esta clase. De esta forma, podrá aislar estos archivos de configuración con fines de prueba.

Entonces use el ConfigurationManager.AppSettings["something"];sugerido y devuelva este valor. Con este método, puede crear algún tipo de devolución predeterminada si no hay ninguna clave disponible en el archivo .config.

Custodio
fuente
3
Microsoft ya tiene un Bulit-en la forma de gestionar múltiples versiones de un mismo archivo de configuración: configuraciones de construcción , lo que permite tener los archivos de configuración separados para cada configuración de generación: app.DEBUG.config, app.RELEASE.configy app.TEST.config, etc.
jpaugh
4

Además, puedes usar Formo :

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>();
pomber
fuente
55
¿Por qué querrías hacer esto?
lukejkw
3

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.

rdans
fuente
3

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

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"];
Jitendra Suthar
fuente
2

Siempre creo una interfaz IConfig con propiedades typesafe declaradas para todos los valores de configuración. Una clase de implementación de Config envuelve las llamadas a System.Configuration. Todas sus llamadas de System.Configuration ahora están 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 de ayuda privados para leer y analizar tipos de datos comunes.

Usando un marco IoC puede acceder a los campos IConfig en cualquier lugar de su aplicación simplemente pasando la interfaz a un constructor de clases. También puede crear implementaciones simuladas de la interfaz IConfig en sus pruebas unitarias para que ahora pueda probar varios valores de configuración y combinaciones de valores sin necesidad de tocar su archivo App.config o Web.config.

Tony O'Hagan
fuente
1

Otra posible solución:

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

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 aplicaciones en el archivo web.config . 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>
Jason
fuente
1

Puedes usar 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 nuevas bibliotecas.

Mohammad D
fuente
1

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

Para hacer esto debes usar

{YourAppName}.Properties.Settings.{settingName}

martin c
fuente
1

Pude lograr que el siguiente enfoque funcione para proyectos de .NET Core:

Pasos:

  1. Cree un appsettings.json (formato que figura a continuación) en su proyecto.
  2. Luego cree una clase de configuración. El formato se proporciona a continuación.
  3. He creado un método de inicio de sesión () 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);
    }
usuario3534040
fuente
1

Si necesita / desea utilizar la ConfigurationManagerclase ...

Puede que tenga que cargar System.Configuration.ConfigurationManagerpor Microsoft a través de NuGet Package Manager

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

Documentos de Microsoft

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 en caché para la aplicación actual, que tiene un mejor rendimiento que la clase de configuración.

Chris Catignani
fuente
0

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

nayanajith
fuente
3
Esta pregunta se hizo hace más de 9 años, y ya tiene más de 20 respuestas, incluidas 2 que tienen 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, este debería ser un comentario sobre la respuesta aceptada.
Richardissimo
Re "superior a 4" : ¿en el número de versión principal? ¿O quieres decir "más alto que 4.0" ? O, en otras palabras, ¿de qué lado estaría .NET Framework 4.5 ?
Peter Mortensen
-8

Aquí hay 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
JMat
fuente