Odczytywanie ustawień z app.config lub web.config w .NET

806

Pracuję nad biblioteką klasy C #, która musi być w stanie odczytać ustawienia z pliku web.configlub app.config(w zależności od tego, czy do DLL odwołuje się aplikacja ASP.NET, czy aplikacja Windows Forms).

Znalazłem to

ConfigurationSettings.AppSettings.Get("MySetting")

działa, ale ten kod został oznaczony przez Microsoft jako przestarzały.

Przeczytałem, że powinienem używać:

ConfigurationManager.AppSettings["MySetting"]

Jednak System.Configuration.ConfigurationManagerklasa nie wydaje się być dostępna z projektu biblioteki klas C #.

Jak najlepiej to zrobić?

Russ Clark
źródło
48
Jakbym czytał 4 przykłady i artykuły MSDN. I wylądował tutaj. Po prostu dodaj odniesienie ... dlaczego nie mogą tak po prostu powiedzieć. Dobre pytanie! +1
Piotr Kula,
1
Jeśli chcesz również zapisać ustawienia z powrotem , spójrz tutaj, jak to zrobić.
Matt

Odpowiedzi:

797

Musisz dodać odniesienie do folderu odniesieńSystem.Configuration w projekcie .

Zdecydowanie powinieneś korzystać ConfigurationManagerz przestarzałych ConfigurationSettings.

womp
źródło
Dziękuję Ci bardzo! bardzo prosta odpowiedź. Budowałem aplikację na konsolę! a ta odpowiedź uratuje dzień!
PatsonLeaner
1
Czy to nadal jest dokładne dla rdzenia .net.
Triynko
867

Przykładowy plik app.config jak poniżej:

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

Czytasz powyższe ustawienia aplikacji, używając kodu pokazanego poniżej:

using System.Configuration;

Może być również konieczne dodanie odniesienia do System.Configurationprojektu, jeśli jeszcze go nie ma. Następnie możesz uzyskać dostęp do takich wartości:

string configvalue1 = ConfigurationManager.AppSettings["countoffiles"];
string configvalue2 = ConfigurationManager.AppSettings["logfilelocation"];
Baran
źródło
124
Twoja odpowiedź podoba mi się bardziej niż odpowiedź zaakceptowana. Odpowiedzi z przykładami zawsze mi pomagają.
Brendan Vogt
To zadziałało dla mnie. Jednak moja System.Configuration nie zawiera ConfigurationManager, więc musiałem użyć ConfigurationSettings. Jak na ironię nadal otrzymałem ostrzeżenie, że jest przestarzałe.
Nightmare Games
13
To mi się też przydarzyło. Czy próbowałeś dodać odwołanie do System.Configuration? Problem polega na tym, że VS oszukuje cię, sprawiając, że myślisz, że go rzeczywiście masz; możesz użyć intellisense, aby uzyskać przestrzeń nazw System.Configuration, ale nie ma ona klasy ConfigurationManager. Po prostu dodaj referencję, która to naprawi.
Francine DeGrood Taylor
3
@Cricketheads System.Configuration zawiera ConfigurationManager, prawdopodobnie brakuje w projekcie odniesienia do System.Configuration.
TreK
2
Czy ktoś może mi powiedzieć, dlaczego ich zdaniem System.Configuracja nie jest dodawana domyślnie ... wydaje się to dość podstawową potrzebą w większości aplikacji.
Todd Vance
89

Aktualizacja dla .NET Framework 4.5 i 4.6; następujące przestaną działać:

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

Teraz uzyskaj dostęp do klasy Setting poprzez Właściwości

string keyvalue = Properties.Settings.Default.keyname;

Aby uzyskać więcej informacji, zobacz Zarządzanie ustawieniami aplikacji .

bsivel
źródło
1
Właściwości od 2010 roku .
Nick Westgate
1
Dziękuję bardzo za opublikowanie tego. Ustaliłem, że Properties.Settings.Default.MachName działa, ale nie mogłem zrozumieć, dlaczego ConfigurationManager.AppSettings [„MachName”] zwrócił wartość null.
J. Chris Compton,
1
To zakończyło moje przedłużające się cierpienie. Dzięki. Ramy powinny ostrzec cię, że stary sposób jest przestarzały.
Neil B
7
Nie mogę potwierdzić. ConfigurationManager.AppSettings [„someKey”] działa w .NET 4.5, 4.6, 4.7.1
Ivanhoe
1
@Ivanhoe Z jakiej wersji VisualStudio korzystałeś? ConfigurationManager.AppSettings [„someKey”] działał z 4.6.1 i VS 15.8.2, ale dla mnie nie powiódł się z 4.6.1 i VS 15.9.2.
kkuilla
37

Kliknij prawym przyciskiem myszy bibliotekę klas i wybierz z menu opcję „Dodaj referencje”.

I z zakładki .NET wybierz System.Configuration. Obejmuje to plik DLL System.Configuration do twojego projektu.

siedmiodniowa żałoba
źródło
Po dodaniu referencji był w stanie to zrobićConfigurationManager.ConnectionStrings[0].ConnectionString
SushiGuy
29

Używam tego i działa dobrze dla mnie:

textBox1.Text = ConfigurationManager.AppSettings["Name"];
Pagey
źródło
48
TS wyraźnie stwierdza, że ​​używa tego samego kodu, ale jego projekt się nie kompiluje (z powodu brakujących referencji, jak się okazało). -1 za brak czytania pytania.
Isantipov
23

Czytaj z konfiguracji:

Musisz dodać odniesienie do konfiguracji:

  1. Otwórz „Właściwości” w swoim projekcie
  2. Przejdź do zakładki „Ustawienia”
  3. Dodaj „Nazwa” i „Wartość”
  4. Uzyskaj wartość za pomocą następującego kodu:

    string value = Properties.Settings.Default.keyname;

Zapisz w konfiguracji:

   Properties.Settings.Default.keyName = value;
   Properties.Settings.Default.Save();
Masoud Siahkali
źródło
1
FYI: Google najbardziej lubi twoją odpowiedź. Pokazuje się dosłownie, gdy wyszukujesz hasło „pobierz ustawienia konfiguracji aplikacji c #”
Steve Gomez,
21

Do projektu należy dodać odwołanie do zestawu System.Configuration.

Otávio Décio
źródło
18

Być może dodajesz plik App.config do pliku DLL. App.Config działa tylko dla projektów wykonywalnych, ponieważ wszystkie pliki DLL pobierają konfigurację z pliku konfiguracyjnego wykonywanego pliku EXE.

Załóżmy, że masz dwa projekty w swoim rozwiązaniu:

  • SomeDll
  • SomeExe

Twój problem może być związany z faktem, że dołączasz plik app.config do SomeDLL, a nie SomeExe. SomeDll jest w stanie odczytać konfigurację z projektu SomeExe.

Victor Naranjo
źródło
Wow, to nie jest oczywiste. Gdyby ktoś mógł połączyć dokument mówiący o tym, byłoby to fantastyczne. Jest to trudny temat do wyszukiwania.
David Krider
Dzięki za to. Nigdzie nie widziałem tego stwierdzonego.
parametr
10

Spróbuj tego:

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

W pliku web.config powinna to być następna struktura:

<configuration>
<appSettings>
<add key="keyname" value="keyvalue" />
</appSettings>
</configuration>
Ruslan
źródło
8

Miałem ten sam problem. Przeczytaj je w ten sposób: System.Configuration.ConfigurationSettings.AppSettings [„MySetting”]

Tomek
źródło
4
Według Microsoft w odniesieniu do ConfigurationSettings.AppSettingsThis method is obsolete, it has been replaced by System.Configuration!System.Configuration.ConfigurationManager.AppSettings
Peter M
2
ta metoda jest przestarzała
GabrielBB
7

web.configjest używany z aplikacjami internetowymi. web.configdomyślnie ma kilka konfiguracji wymaganych dla aplikacji internetowej. Możesz mieć web.configdla każdego folderu w swojej aplikacji internetowej.

app.configjest używany w aplikacjach Windows. Gdy kompilujesz aplikację w Visual Studio, zostanie ona automatycznie zmieniona na nazwę <appname>.exe.configi ten plik musi zostać dostarczony wraz z aplikacją.

Tej samej metody można użyć do wywołania app settingswartości z obu plików konfiguracyjnych: System.Configuration.ConfigurationSettings.AppSettings [„Key”]

Wavare Santosh
źródło
Można również użyć System.Configuration.COnfigurationSettings.AppSettings.Get("Key")zamiast nawiasów kwadratowych.
Mason,
7

Ponieważ znalazłem najlepsze podejście do uzyskiwania dostępu do zmiennych ustawień aplikacji w sposób systematyczny, tworząc klasę opakowania nad System.Configuracja jak poniżej

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

Teraz możemy uzyskać dostęp do potrzebnych zmiennych ustawień za pomocą zakodowanych nazw przy użyciu innej klasy, jak poniżej:

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
źródło
Wykorzystuje to metodę wskazaną przez OP jako przestarzałą.
user2864740,
4

Zdecydowanie zalecamy utworzenie opakowania dla tego połączenia. Coś w rodzaju ConfigurationReaderServicei użyj zastrzyku zależności, aby uzyskać tę klasę. W ten sposób będziesz mógł odizolować te pliki konfiguracyjne do celów testowych.

Więc użyj ConfigurationManager.AppSettings["something"];sugerowanej i zwróć tę wartość. Za pomocą tej metody możesz utworzyć domyślny zwrot, jeśli w pliku .config nie ma żadnego klucza.

Custodio
źródło
3
Microsoft ma już bulit-in sposób zarządzać wieloma wersjami tego samego pliku config: konfiguracje kompilacji , które pozwalają posiadające oddzielne pliki konfiguracyjne dla każdej konfiguracji kompilacji: app.DEBUG.config, app.RELEASE.configi app.TEST.configitp
jpaugh
4

Możesz także użyć Formo :

Konfiguracja:

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

Kod:

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
źródło
5
Dlaczego, u licha, chcesz to zrobić?
lukejkw
3

Dla kompletności istnieje inna opcja dostępna tylko dla projektów internetowych: System.Web.Configuration.WebConfigurationManager.AppSettings [„MySetting”]

Zaletą tego jest to, że nie wymaga dodania dodatkowego odniesienia, więc może być preferowane dla niektórych osób.

rdans
źródło
3

Krok 1: Kliknij prawym przyciskiem myszy zakładkę odniesienia, aby dodać odniesienie.

Krok 2: Kliknij kartę Zespoły

Krok 3: Wyszukaj „Konfiguracja systemu”

Krok 4: Kliknij OK.

Wtedy to zadziała.

 string value = System.Configuration.ConfigurationManager.AppSettings["keyname"];
Jitendra Suthar
źródło
2

Zawsze tworzę interfejs IConfig z właściwościami typeafe zadeklarowanymi dla wszystkich wartości konfiguracyjnych. Klasa implementacji Config następnie zawija wywołania do System.Configuration. Wszystkie twoje wywołania System.Configuracja są teraz w jednym miejscu, a utrzymanie i śledzenie, które pola są używane, i deklarowanie ich wartości domyślnych jest o wiele łatwiejsze i czystsze. Piszę zestaw prywatnych metod pomocniczych do odczytu i analizy typowych typów danych.

Za pomocą frameworka IoC można uzyskać dostęp do pól IConfig w dowolnym miejscu w aplikacji, po prostu przekazując interfejs do konstruktora klasy. Następnie możesz również tworzyć symulacje implementacji interfejsu IConfig w testach jednostkowych, dzięki czemu możesz teraz testować różne wartości konfiguracji i kombinacje wartości bez konieczności dotykania pliku App.config lub Web.config.

Tony O'Hagan
źródło
1

Inne możliwe rozwiązanie:

var MyReader = new System.Configuration.AppSettingsReader();
string keyvalue = MyReader.GetValue("keyalue",typeof(string)).ToString();
Sherite
źródło
1

Od kilku dni próbuję znaleźć rozwiązanie tego samego problemu. Udało mi się to rozwiązać, dodając klucz w znaczniku appsettings w pliku web.config . Powinno to zastąpić plik .dll podczas korzystania z pomocnika.

<configuration>
    <appSettings>
        <add key="loginUrl" value="~/RedirectValue.cshtml" />
        <add key="autoFormsAuthentication" value="false"/>
    </appSettings>
</configuration>
Jason
źródło
1

Możesz użyć poniższej linii. W moim przypadku działało: System.Configuration.ConfigurationSettings.AppSettings ["yourKeyName"]

Musisz uważać, aby powyższy wiersz kodu był również starą wersją i był przestarzały w nowych bibliotekach.

Mohammad D.
źródło
1

Menedżer konfiguracji ConfigurationManager nie jest tym, czego potrzebujesz, aby uzyskać dostęp do własnych ustawień.

Aby to zrobić, powinieneś użyć

{YourAppName}.Properties.Settings.{settingName}

Martin c
źródło
1

Udało mi się uzyskać poniższe podejście do pracy w projektach .NET Core:

Kroki:

  1. Utwórz appsettings.json (format podany poniżej) w swoim projekcie.
  2. Następnie utwórz klasę konfiguracji. Format znajduje się poniżej.
  3. Utworzyłem metodę Login (), aby pokazać użycie klasy konfiguracji.

    Utwórz appsettings.json w swoim projekcie z zawartością:

    {
      "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);
    }
użytkownik3534040
źródło
1

Jeśli potrzebujesz / chcesz skorzystać z ConfigurationManagerklasy ...

Może być konieczne załadowanie System.Configuration.ConfigurationManagerprzez Microsoft za pomocą NuGet Package Manager

Narzędzia-> Menedżer pakietów NuGet-> Zarządzaj pakietami NuGet dla rozwiązania ...

Dokumenty Microsoft

Warto zwrócić uwagę na dokumenty ...

Jeśli aplikacja potrzebuje dostępu tylko do odczytu do własnej konfiguracji, zalecamy użycie metody GetSection (String). Ta metoda zapewnia dostęp do buforowanych wartości konfiguracji dla bieżącej aplikacji, która ma lepszą wydajność niż klasa Configuration.

Chris Catignani
źródło
0

Sprawdź wersję .NET, nad którą pracujesz. Powinien być wyższy niż 4. I musisz dodać bibliotekę systemową System.Configuration do swojej aplikacji.

nayanajith
źródło
3
To pytanie zostało zadane ponad 9 lat temu i ma już ponad 20 odpowiedzi, w tym 2, z których każda ma ponad 600 głosów pozytywnych, akceptowaną odpowiedzią jest dodanie odniesienia do System.Configuration. Ta dodatkowa odpowiedź nie dodaje wartości. W najlepszym przypadku powinien to być komentarz do zaakceptowanej odpowiedzi.
Richardissimo,
Re „wyższy niż 4” : w głównym numerze wersji? A może masz na myśli „wyższy niż 4.0” ? Lub innymi słowy, po której stronie byłby .NET Framework 4.5 ?
Peter Mortensen
-8

Oto przykład: 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
źródło