Чтение настроек из app.config или web.config в .NET

807

Я работаю над библиотекой классов C #, которая должна иметь возможность считывать настройки из файла web.configили app.config(в зависимости от того, есть ли ссылка на DLL из веб-приложения ASP.NET или приложения Windows Forms).

Я нашел это

ConfigurationSettings.AppSettings.Get("MySetting")

работает, но этот код был помечен как устаревший Microsoft.

Я прочитал, что я должен использовать:

ConfigurationManager.AppSettings["MySetting"]

Тем не менее, System.Configuration.ConfigurationManagerкажется , что класс не доступен из проекта библиотеки классов C #.

Каков наилучший способ сделать это?

Расс Кларк
источник
48
Как я прочитал 4 MSDN примеров и статей .. И приземлился здесь. Просто добавьте ссылку ... почему они не могут просто сказать это. Хороший вопрос! +1
Петр Кула
1
Если вы хотите , чтобы записать настройки обратно , а также, смотрите здесь , как вы можете это сделать.
Мэтт

Ответы:

798

Вам нужно добавить ссылку на System.Configurationв вашем проекте папки ссылки .

Вы должны определенно использовать ConfigurationManagerустаревшие ConfigurationSettings.

WOMP
источник
Большое спасибо! очень прямой ответ. Я строил консольное приложение! и этот ответ сохранить день!
PatsonLeaner
1
Точно ли это для ядра .net?
Трийнко
869

Для примера файла app.config, как показано ниже:

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

Вы прочитали вышеуказанные настройки приложения, используя код, показанный ниже:

using System.Configuration;

Вам также может понадобиться добавить ссылку на System.Configurationваш проект, если ее еще нет. Затем вы можете получить доступ к значениям следующим образом:

string configvalue1 = ConfigurationManager.AppSettings["countoffiles"];
string configvalue2 = ConfigurationManager.AppSettings["logfilelocation"];
Баран
источник
124
Мне нравится ваш ответ больше, чем принятый ответ. Ответы с примерами всегда помогают мне.
Брендан Фогт
Это сработало для меня. Однако мой System.Configuration не содержит ConfigurationManager, поэтому мне пришлось использовать ConfigurationSettings. По иронии судьбы, я все еще получил предупреждение, что оно устарело.
Кошмарные игры
13
Это случилось со мной тоже. Вы пытались добавить ссылку System.Configuration? Проблема в том, что VS обманывает вас, заставляя думать, что у вас это есть; Вы можете использовать intellisense для получения пространства имен System.Configuration, но у него нет класса ConfigurationManager. Просто добавьте ссылку, и это исправит.
Франсин ДеГруд Тейлор
3
@Cricketheads System.Configuration содержит ConfigurationManager, в вашем проекте, скорее всего, отсутствует ссылка на System.Configuration.
Трек
2
Может кто-нибудь сказать мне, почему они думают, что System.Configuration не добавлена ​​по умолчанию ... это кажется довольно простой потребностью в большинстве приложений.
Тодд Вэнс
89

Обновление для .NET Framework 4.5 и 4.6; следующее больше не будет работать:

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

Теперь перейдите к классу Setting через Свойства:

string keyvalue = Properties.Settings.Default.keyname;

См. Управление настройками приложения для получения дополнительной информации.

bsivel
источник
1
Недвижимость с 2010 года .
Ник Вестгейт,
1
Большое спасибо за размещение этого. Я определил, что Properties.Settings.Default.MachName работает, но я не мог понять, почему ConfigurationManager.AppSettings ["MachName"] возвратил ноль.
Дж. Крис Комптон
1
Это закончило мою длительную агонию. Спасибо. Структура должна предупредить вас, что старый способ устарел.
Нил Б
7
Не могу подтвердить. ConfigurationManager.AppSettings ["someKey"] работает в .NET 4.5, 4.6, 4.7.1
Ivanhoe
1
@Ivanhoe Какую версию VisualStudio вы использовали? ConfigurationManager.AppSettings ["someKey"] работал с 4.6.1 и VS 15.8.2, но не работал с 4.6.1 и VS 15.9.2 для меня.
kkuilla
37

Щелкните правой кнопкой мыши на своей библиотеке классов и выберите в меню пункт «Добавить ссылки».

И на вкладке .NET выберите System.Configuration. Это будет включать файл DLL System.Configuration в ваш проект.

Шива
источник
После добавления ссылки, смог сделатьConfigurationManager.ConnectionStrings[0].ConnectionString
SushiGuy
29

Я использую это, и это хорошо работает для меня:

textBox1.Text = ConfigurationManager.AppSettings["Name"];
Пейджи
источник
48
TS явно заявляет, что он использует тот же код, но его проект не компилируется (как оказалось, из-за отсутствующих ссылок). -1 за то, что не читал вопрос.
Исантипов
23

Читать из конфигурации:

Вам нужно будет добавить ссылку на конфигурацию:

  1. Откройте «Свойства» на вашем проекте
  2. Перейти на вкладку «Настройки»
  3. Добавить «Имя» и «Значение»
  4. Получить значение с помощью следующего кода:

    string value = Properties.Settings.Default.keyname;

Сохранить в конфигурации:

   Properties.Settings.Default.keyName = value;
   Properties.Settings.Default.Save();
Масуд Сиахкали
источник
1
К вашему сведению: Google больше всего нравится ваш ответ. Появляется дословно при поиске «получить настройки конфигурации приложения c #»
Стив Гомес
21

Вы должны добавить ссылку на сборку System.Configuration в проект.

Otávio Décio
источник
18

Возможно, вы добавляете файл App.config в файл DLL. App.Config работает только для исполняемых проектов, так как все файлы DLL берут конфигурацию из файла конфигурации для исполняемого файла EXE.

Допустим, у вас есть два проекта в вашем решении:

  • SomeDll
  • SomeExe

Ваша проблема может быть связана с тем, что вы включаете файл app.config в SomeDLL, а не SomeExe. SomeDll может читать конфигурацию из проекта SomeExe.

Виктор Наранхо
источник
Вау, это не очевидно. Если бы кто-то мог связать документ, говорящий об этом, это было бы здорово. Это сложная тема для поиска.
Дэвид Кридер
Спасибо за это. Не видел нигде заявленного.
параметр
10

Попробуй это:

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

В файле web.config это должно быть следующей структурой:

<configuration>
<appSettings>
<add key="keyname" value="keyvalue" />
</appSettings>
</configuration>
Руслан
источник
8

У меня такая же проблема. Просто прочитайте их следующим образом: System.Configuration.ConfigurationSettings.AppSettings ["MySetting"]

Том
источник
4
Согласно Microsoft относительно ConfigurationSettings.AppSettingsThis method is obsolete, it has been replaced by System.Configuration!System.Configuration.ConfigurationManager.AppSettings
Питер М
2
этот метод
устарел
7

web.configиспользуется с веб-приложениями. web.configпо умолчанию имеет несколько конфигураций, необходимых для веб-приложения. Вы можете иметь web.configдля каждой папки в вашем веб-приложении.

app.configиспользуется для приложений Windows. Когда вы создаете приложение в Visual Studio, оно будет автоматически переименовано, <appname>.exe.configи этот файл должен быть доставлен вместе с вашим приложением.

Вы можете использовать один и тот же метод для вызова app settingsзначений из обоих файлов конфигурации: System.Configuration.ConfigurationSettings.AppSettings ["Key"]

Ваваре Сантош
источник
Также возможно использовать System.Configuration.COnfigurationSettings.AppSettings.Get("Key")вместо использования квадратных скобок.
Мейсон
7

Как я обнаружил, лучший подход для систематического доступа к переменным настроек приложения - создать класс-оболочку над System.Configuration, как показано ниже.

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

Теперь мы можем получить доступ к необходимым переменным настроек по жестко закодированным именам, используя другой класс, как показано ниже:

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
}
Ашвини Джиндал
источник
При этом используется метод, который указывает OP, помечается как устаревший.
user2864740
4

Я настоятельно рекомендую вам создать обертку для этого звонка. Что-то вроде ConfigurationReaderServiceи использовать инъекцию зависимостей, чтобы получить этот класс. Таким образом, вы сможете изолировать эти файлы конфигурации для целей тестирования.

Так что используйте ConfigurationManager.AppSettings["something"];предложенное и верните это значение. С помощью этого метода вы можете создать какой-нибудь возврат по умолчанию, если в файле .config нет ключа.

Custodio
источник
3
Microsoft уже имеет Bulit-в способе управления нескольких версий одного и тот же файл конфигурации: конфигурации сборки , которые позволяют иметь отдельные конфигурационные файлы для каждой конфигурации сборки: app.DEBUG.config, app.RELEASE.configи app.TEST.configт.д.
jpaugh
4

Также вы можете использовать Formo :

Конфигурация:

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

Код:

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
источник
5
С какой стати вы хотите это сделать?
Lukejkw
3

Просто для полноты, есть еще один вариант, доступный только для веб-проектов: System.Web.Configuration.WebConfigurationManager.AppSettings ["MySetting"]

Преимущество этого в том, что он не требует добавления дополнительной ссылки, поэтому он может быть предпочтительным для некоторых людей.

rdans
источник
3

Шаг 1: Щелкните правой кнопкой мыши на вкладке ссылок, чтобы добавить ссылку.

Шаг 2: Нажмите на вкладку Сборки

Шаг 3: Поиск «System.Configuration»

Шаг 4: Нажмите ОК.

Тогда это будет работать.

 string value = System.Configuration.ConfigurationManager.AppSettings["keyname"];
Джитендра Сутар
источник
2

Я всегда создаю интерфейс IConfig с типобезопасными свойствами, объявленными для всех значений конфигурации. Затем класс реализации Config оборачивает вызовы System.Configuration. Все ваши вызовы System.Configuration теперь находятся в одном месте, и намного проще и понятнее поддерживать и отслеживать, какие поля используются, и объявлять их значения по умолчанию. Я пишу набор частных вспомогательных методов для чтения и анализа общих типов данных.

Используя платформу IoC, вы можете получить доступ к полям IConfig в любом месте вашего приложения, просто передав интерфейс в конструктор класса. После этого вы также сможете создавать имитационные реализации интерфейса IConfig в своих модульных тестах, чтобы теперь вы могли тестировать различные значения конфигурации и комбинации значений без необходимости прикасаться к файлу App.config или Web.config.

Тони О'Хаган
источник
1

Другое возможное решение:

var MyReader = new System.Configuration.AppSettingsReader();
string keyvalue = MyReader.GetValue("keyalue",typeof(string)).ToString();
sherite
источник
1

Я пытался найти решение этой проблемы уже пару дней. Я смог решить эту проблему, добавив ключ в тег appsettings в файле web.config . Это должно переопределить файл .dll при использовании помощника.

<configuration>
    <appSettings>
        <add key="loginUrl" value="~/RedirectValue.cshtml" />
        <add key="autoFormsAuthentication" value="false"/>
    </appSettings>
</configuration>
Джейсон
источник
1

Вы можете использовать ниже строку. В моем случае это работало: System.Configuration.ConfigurationSettings.AppSettings ["yourKeyName"]

Вы должны позаботиться о том, чтобы приведенная выше строка кода также была старой версией, и она устарела в новых библиотеках.

Мухаммед Д
источник
1

ConfigurationManager - это не то, что вам нужно для доступа к вашим собственным настройкам.

Для этого вы должны использовать

{YourAppName}.Properties.Settings.{settingName}

мартин с
источник
1

Мне удалось заставить следующий подход работать на .NET Core проектах:

шаги:

  1. Создайте appsettings.json (формат указан ниже) в вашем проекте.
  2. Затем создайте класс конфигурации. Формат представлен ниже.
  3. Я создал метод Login (), чтобы показать использование класса конфигурации.

    Создайте appsettings.json в своем проекте с контентом:

    {
      "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);
    }
user3534040
источник
1

Если вы нуждаетесь / хотите использовать ConfigurationManagerкласс ...

Вам может потребоваться загрузка System.Configuration.ConfigurationManagerчерез Microsoft через диспетчер пакетов NuGet

Инструменты-> Диспетчер пакетов NuGet-> Управление пакетами NuGet для решения ...

Документы Microsoft

Из документов следует отметить одну вещь ...

Если вашему приложению необходим доступ только для чтения к своей собственной конфигурации, мы рекомендуем использовать метод GetSection (String). Этот метод обеспечивает доступ к кэшированным значениям конфигурации для текущего приложения, которое имеет лучшую производительность, чем класс Configuration.

Крис Катиньяни
источник
0

Пожалуйста, проверьте версию .NET, над которой вы работаете. Оно должно быть больше 4. И вам нужно добавить системную библиотеку System.Configuration в ваше приложение.

nayanajith
источник
3
Этот вопрос был задан более 9 лет назад, и уже имеет более 20 ответов, в том числе 2, каждый из которых имеет более 600 голосов, и принято добавить ссылку на System.Configuration. Этот дополнительный ответ не добавляет ценности. В лучшем случае это должен быть комментарий к принятому ответу.
Ричардиссимо
Re "выше, чем 4" : в основной номер версии? Или ты имеешь в виду "выше 4,0" ? Или, другими словами, на какой стороне будет .NET Framework 4.5 ?
Питер Мортенсен
-8

Вот пример: 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
источник