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

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

Я обнаружил, что

ConfigurationSettings.AppSettings.Get("MySetting")

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

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

ConfigurationManager.AppSettings["MySetting"]

Однако класс System.Configuration.ConfigurationManager, похоже, не доступен из проекта библиотеки классов С#.

Кто-нибудь знает, что лучший способ сделать это?

Ответ 1

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

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

Ответ 2

Для примера 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"];

Надеюсь это поможет!

Ответ 3

Обновление для фреймворков 4.5 и 4.6; следующее больше не будет работать:

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

Теперь перейдите в класс настроек через Properties:

string keyvalue= Properties.Settings.Default.keyname;

Подробнее см. "Управление настройками приложения" .

Ответ 4

Щелкните правой кнопкой мыши на своей библиотеке классов и выберите "Добавить ссылки" в меню; и, наконец, с вкладки .NET выберите System.Configuration. Это будет включать DLL System.Configuration в ваш проект.

Ответ 5

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

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

Ответ 6

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

Вам нужно добавить ссылку на Config

  • Откройте "Свойства" в вашем проекте
  • Перейдите на вкладку "Настройки"
  • Добавьте "Имя" и "Значение"
  • Получить значение с помощью следующего кода:

    string value = Properties.Settings.Default.keyname;

Сохранить в настройках:

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

Ответ 7

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

Ответ 8

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

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

  • SomeDll
  • SomeExe

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

Ответ 9

Попробуйте следующее:

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

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

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

Ответ 10

У меня была та же проблема, просто прочитайте их следующим образом:

System.Configuration.ConfigurationSettings.AppSettings["MySetting"]

Ответ 11

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

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

Вы можете использовать один и тот же метод для вызова значений app settings из обоих файлов конфигурации:

System.Configuration.ConfigurationSettings.AppSettings["Key"]

Ответ 12

Как я нашел лучший подход для доступа к переменным параметрам приложения системным образом, создав класс-оболочку над 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
    }

Ответ 13

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

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

Ответ 14

Кроме того, вы можете использовать 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>();

Ответ 15

Просто для полноты, есть еще один вариант, доступный только для веб-проектов:

System.Web.Configuration.WebConfigurationManager.AppSettings["MySetting"]

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

Ответ 16

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

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

Ответ 17

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

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

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

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

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

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

Ответ 18

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

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

Ответ 19

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

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

Ответ 20

Вы можете использовать ниже линии, в моем случае это работало:

System.Configuration.ConfigurationSettings.AppSettings["yourKeyName"]

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

Ответ 21

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

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

{YourAppName}.Properties.Settings.{settingName}

Ответ 22

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

Ответ 23

Мне удалось получить подход ниже, работая для проектов .netcore:

Шаги:

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

Create appsettings.json in your project with content :
'
{
  "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([email protected]"Environments:{env}");
        }

    }
'


'
 public void Login()
        {
            var environment = Configuration.EnvironmentInfo();
            Email.SendKeys(environment["username"]);
            Password.SendKeys(environment["password"]);
            WaitForElementToBeClickableAndClick(_driver, SignIn);
        }
'

Ответ 24

вот пример: 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