Lettura delle impostazioni da app.config o web.config in .NET


807

Sto lavorando su una libreria di classe C # che deve essere in grado di leggere le impostazioni dal file web.configo app.config(a seconda che si faccia riferimento alla DLL da un'applicazione Web ASP.NET o da un'applicazione Windows Form).

L'ho trovato

ConfigurationSettings.AppSettings.Get("MySetting")

funziona, ma quel codice è stato contrassegnato come deprecato da Microsoft.

Ho letto che dovrei usare:

ConfigurationManager.AppSettings["MySetting"]

Tuttavia, la System.Configuration.ConfigurationManagerclasse non sembra essere disponibile da un progetto Libreria di classi C #.

Qual è il modo migliore per farlo?


48
Come se avessi letto 4 esempi e articoli su MSDN. E sono arrivato qui. Basta aggiungere un riferimento ... perché non possono semplicemente dirlo. Buona domanda! +1
Piotr Kula,

1
Se vuoi riscrivere anche le impostazioni , guarda qui come puoi farlo.
Matt,

Risposte:


798

Dovrai aggiungere un riferimento a System.Configurationnella cartella dei riferimenti del tuo progetto .

Dovresti assolutamente usare ConfigurationManageril obsoleto ConfigurationSettings.


Grazie mille! risposta molto diretta. Stavo costruendo un'app console! e questa risposta salva la giornata!
PatsonLeaner,

1
È ancora accurato per il core .net.
Triynko,

868

Per un file app.config di esempio come di seguito:

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

Leggi le impostazioni dell'applicazione sopra usando il codice mostrato sotto:

using System.Configuration;

Potrebbe anche essere necessario aggiungere un riferimento al System.Configurationtuo progetto se non ce n'è già uno. È quindi possibile accedere ai valori in questo modo:

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

124
Mi piace la tua risposta più della risposta accettata. Le risposte con esempi fanno sempre il trucco per me.
Brendan Vogt,

Questo ha funzionato per me. Tuttavia, il mio System.Configuration non contiene un ConfigurationManager, quindi ho dovuto usare ConfigurationSettings. Ironia della sorte, ho ancora ricevuto un avvertimento che era obsoleto.
Nightmare Games,

13
Questo è successo anche a me. Hai provato ad aggiungere il riferimento System.Configuration? Il problema è che VS ti inganna facendoti pensare di averlo effettivamente; puoi usare intellisense per ottenere lo spazio dei nomi System.Configuration ma non ha la classe ConfigurationManager. Basta aggiungere il riferimento e questo lo risolve.
Francine DeGrood Taylor,

3
@Cricketheads System.Configuration contiene ConfigurationManager, probabilmente ti manca un riferimento a System.Configuration nel tuo progetto.
TreK

2
Qualcuno può dirmi perché pensano che System.Configuration non sia aggiunto di default ... questo sembra un bisogno piuttosto basilare nella maggior parte delle applicazioni.
Todd Vance,

89

Aggiornamento per .NET Framework 4.5 e 4.6; il seguente non funzionerà più:

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

Ora accedi alla classe Setting tramite Proprietà:

string keyvalue = Properties.Settings.Default.keyname;

Vedere Gestione delle impostazioni dell'applicazione per ulteriori informazioni.


1
Proprietà dal 2010 .
Nick Westgate,

1
Grazie mille per aver pubblicato questo. Ho determinato che Properties.Settings.Default.MachName ha funzionato, ma non sono riuscito a capire perché ConfigurationManager.AppSettings ["MachName"] ha restituito null.
J. Chris Compton,

1
Questo ha concluso la mia agonia prolungata. Grazie. Il framework dovrebbe avvisarti che il vecchio modo è obsoleto.
Neil B,

7
Non posso confermare ConfigurationManager.AppSettings ["someKey"] funziona in .NET 4.5, 4.6, 4.7.1
Ivanhoe

1
@Ivanhoe Quale versione di VisualStudio hai usato? ConfigurationManager.AppSettings ["someKey"] ha funzionato con 4.6.1 e VS 15.8.2 ma non è riuscito con 4.6.1 e VS 15.9.2 per me.
kkuilla,

37

Fare clic con il tasto destro sulla libreria di classi e selezionare l'opzione "Aggiungi riferimenti" dal menu.

E dalla scheda .NET, selezionare System.Configuration. Ciò includerebbe il file DLL System.Configuration nel progetto.


Dopo aver aggiunto il riferimento, è stato in grado di fareConfigurationManager.ConnectionStrings[0].ConnectionString
SushiGuy

29

Lo sto usando e funziona bene per me:

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

48
Il TS afferma esplicitamente che usa lo stesso codice, ma il suo progetto non riesce a compilare (a causa di riferimenti mancanti, come si è scoperto). -1 per non leggere la domanda.
Isantipov,

23

Leggi da Config:

Dovrai aggiungere un riferimento alla configurazione:

  1. Apri "Proprietà" sul tuo progetto
  2. Vai alla scheda "Impostazioni"
  3. Aggiungi "Nome" e "Valore"
  4. Ottieni valore utilizzando il seguente codice:

    string value = Properties.Settings.Default.keyname;

Salva nella configurazione:

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

1
Cordiali saluti: Google preferisce la tua risposta. Viene visualizzato alla lettera quando cerchi "ottieni impostazioni di configurazione app c #"
Steve Gomez,

21

È necessario aggiungere un riferimento all'assembly System.Configuration al progetto.


18

È possibile che si stia aggiungendo il file App.config in un file DLL. App.Config funziona solo per progetti eseguibili, poiché tutti i file DLL prendono la configurazione dal file di configurazione per il file EXE in esecuzione.

Diciamo che hai due progetti nella tua soluzione:

  • SomeDll
  • SomeExe

Il tuo problema potrebbe essere correlato al fatto che stai includendo il file app.config in SomeDLL e non in SomeExe. SomeDll è in grado di leggere la configurazione dal progetto SomeExe.


Wow, non è ovvio. Se qualcuno potesse collegare un documento che ne parla, sarebbe fantastico. Questo è un argomento difficile su cui cercare.
David Krider,

Grazie per questo. Non l'ho visto dichiarato da nessuna parte.
parametro

10

Prova questo:

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

Nel file web.config questa dovrebbe essere la struttura successiva:

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

8

Ho avuto lo stesso problema. Leggili in questo modo: System.Configuration.ConfigurationSettings.AppSettings ["MySetting"]


4
Secondo Microsoft per quanto riguarda ConfigurationSettings.AppSettingsThis method is obsolete, it has been replaced by System.Configuration!System.Configuration.ConfigurationManager.AppSettings
Peter M,

2
questo metodo è obsoleto
GabrielBB

7

web.configviene utilizzato con applicazioni Web. web.configper impostazione predefinita sono necessarie diverse configurazioni per l'applicazione Web. Puoi avere un web.configper ogni cartella nella tua applicazione web.

app.configè usato per applicazioni Windows. Quando si crea l'applicazione in Visual Studio, questa verrà automaticamente rinominata <appname>.exe.confige questo file deve essere recapitato insieme all'applicazione.

È possibile utilizzare lo stesso metodo per chiamare i app settingsvalori da entrambi i file di configurazione: System.Configuration.ConfigurationSettings.AppSettings ["Key"]


È anche possibile utilizzare System.Configuration.COnfigurationSettings.AppSettings.Get("Key")invece di utilizzare le parentesi quadre.
Mason,

7

Come ho trovato l'approccio migliore per accedere alle variabili delle impostazioni dell'applicazione in modo sistematico creando una classe wrapper su System.Configuration come di seguito

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

Ora possiamo accedere alle variabili delle impostazioni necessarie con nomi codificati utilizzando un'altra classe come di seguito:

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
}

Questo utilizza il metodo indicato dall'OP è contrassegnato come obsoleto.
user2864740

4

Ti consiglio vivamente di creare un wrapper per questa chiamata. Qualcosa di simile a ConfigurationReaderServicee usare l' iniezione di dipendenza per ottenere questa classe. In questo modo sarai in grado di isolare questi file di configurazione a scopo di test.

Quindi usa il ConfigurationManager.AppSettings["something"];suggerito e restituisci questo valore. Con questo metodo è possibile creare un tipo di ritorno predefinito se non è disponibile alcuna chiave nel file .config.


3
Microsoft ha già un modo bulit-in per gestire più versioni dello stesso file di configurazione: configurazioni di build , che permettono di avere file di configurazione separati per ogni configurazione di generazione: app.DEBUG.config, app.RELEASE.config, e app.TEST.config, ecc
jpaugh

4

Inoltre, puoi usare Formo :

Configurazione:

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

Codice:

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

5
Perché mai vorresti farlo?
lukejkw,

3

Per completezza, esiste un'altra opzione disponibile solo per progetti Web: System.Web.Configuration.WebConfigurationManager.AppSettings ["MySetting"]

Il vantaggio di ciò è che non richiede l'aggiunta di un riferimento aggiuntivo, quindi potrebbe essere preferibile per alcune persone.


3

Passaggio 1: fare clic con il pulsante destro del mouse sulla scheda Riferimenti per aggiungere riferimento.

Passaggio 2: fare clic sulla scheda Assiemi

Passaggio 3: cercare "System.Configuration"

Passaggio 4: fare clic su OK.

Quindi funzionerà.

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

2

Creo sempre un'interfaccia IConfig con proprietà typesafe dichiarate per tutti i valori di configurazione. Una classe di implementazione Config quindi avvolge le chiamate a System.Configuration. Tutte le chiamate di System.Configuration sono ora in un unico posto ed è molto più semplice e pulito mantenere e tenere traccia di quali campi vengono utilizzati e dichiararne i valori predefiniti. Scrivo una serie di metodi di supporto privati ​​per leggere e analizzare tipi di dati comuni.

Utilizzando un framework IoC è possibile accedere ai campi IConfig ovunque nell'applicazione semplicemente passando l'interfaccia a un costruttore di classi. Inoltre, puoi creare finte implementazioni dell'interfaccia IConfig nei test delle unità in modo da poter ora testare vari valori di configurazione e combinazioni di valori senza dover toccare il file App.config o Web.config.


1

Un'altra possibile soluzione:

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

1

Ho cercato di trovare una soluzione per questo stesso problema per un paio di giorni ormai. Sono stato in grado di risolvere questo problema aggiungendo una chiave all'interno del tag appsettings nel file web.config . Questo dovrebbe sovrascrivere il file DLL quando si utilizza l'helper.

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

1

Puoi usare la riga sotto. Nel mio caso funzionava: System.Configuration.ConfigurationSettings.AppSettings ["yourKeyName"]

È necessario assicurarsi che la riga di codice sopra sia anche la versione precedente ed è obsoleta nelle nuove librerie.


1

ConfigurationManager non è ciò di cui hai bisogno per accedere alle tue impostazioni.

Per fare questo dovresti usare

{YourAppName}.Properties.Settings.{settingName}


1

Sono stato in grado di far funzionare l'approccio seguente per i progetti .NET Core:

passi:

  1. Crea un appsettings.json (formato indicato di seguito) nel tuo progetto.
  2. Quindi creare una classe di configurazione. Il formato è fornito di seguito.
  3. Ho creato un metodo Login () per mostrare l'utilizzo della classe di configurazione.

    Crea appsettings.json nel tuo progetto con contenuti:

    {
      "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);
    }

1

Se hai bisogno / vuoi usare la ConfigurationManagerclasse ...

Potrebbe essere necessario caricare System.Configuration.ConfigurationManagerda Microsoft tramite NuGet Package Manager

Strumenti-> Gestore pacchetti NuGet-> Gestisci pacchetti NuGet per soluzione ...

Microsoft Docs

Una cosa degna di nota dai documenti ...

Se l'applicazione richiede l'accesso in sola lettura alla propria configurazione, si consiglia di utilizzare il metodo GetSection (String). Questo metodo fornisce l'accesso ai valori di configurazione memorizzati nella cache per l'applicazione corrente, che offre prestazioni migliori rispetto alla classe Configuration.


0

Controlla la versione .NET su cui stai lavorando. Dovrebbe essere superiore a 4. E devi aggiungere la libreria di sistema System.Configuration alla tua applicazione.


3
Questa domanda è stata posta oltre 9 anni fa e ha già oltre 20 risposte, di cui 2 ciascuna con oltre 600 voti positivi, la risposta accettata è quella di aggiungere un riferimento a System.Configuration. Questa risposta aggiuntiva non aggiunge valore. Nella migliore delle ipotesi, questo dovrebbe essere un commento sulla risposta accettata.
Richardissimo,

Ri "superiore a 4" : nel numero di versione principale? O vuoi dire "superiore a 4.0" ? O in altre parole, da che parte starebbe .NET Framework 4.5 ?
Peter Mortensen,

-8

Ecco un esempio: 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.