Конфигурация .NET (app.config / web.config / settings.settings) - PullRequest
160 голосов
/ 25 сентября 2008

У меня есть приложение .NET, в котором есть разные файлы конфигурации для сборок Debug и Release. Например. файл debug app.config указывает на разработку SQL Server , для которой включена отладка, а цель выпуска указывает на работающий SQL Server. Существуют также другие настройки, некоторые из которых отличаются в отладке / выпуске.

В настоящее время я использую два отдельных файла конфигурации (debug.app.config и release.app.config). У меня есть событие сборки проекта, в котором говорится, что если это сборка выпуска, скопируйте файл release.app.config в app.config, иначе скопируйте debug.app.config в app.config.

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

Есть ли лучший / рекомендуемый / предпочтительный метод для достижения аналогичного эффекта? Или в равной степени я подошел к этому совершенно неправильно и есть ли лучший подход?

Ответы [ 13 ]

2 голосов
/ 26 февраля 2009

Как и вы, я также настроил 'multi' app.config - например, app.configDEV, app.configTEST, app.config.LOCAL. Я вижу некоторые из предложенных отличных альтернатив, но если вам нравится, как это работает для вас, я бы добавил следующее:

У меня есть
<appSettings>
<add key = "Env" value = "[Local] "/> для каждого приложения я добавляю это в пользовательский интерфейс в заголовке: from ConfigurationManager.AppSettings.Get ("Env");

Я просто переименую конфигурацию в ту, на которую нацеливаюсь (у меня есть проект с 8 приложениями с большим количеством настроек базы данных / wcf против 4 событий). Для развертывания с помощью clickonce в каждом я меняю 4 варианта в проекте и перехожу. (это я бы хотел автоматизировать)

Единственное, что мне нужно, - это помнить «очистить все» после изменения, так как старый конфиг «застрял» после ручного переименования. (Что, я думаю, решит проблему с настройкой.)

Я считаю, что это действительно хорошо работает (однажды у меня будет время взглянуть на MSBuild / NAnt)

0 голосов
/ 10 сентября 2018

Web.config:

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

AppSetting.json:

Для всего остального, что не касается IIS, вы используете AppSetting.json. AppSetting.json используется для хостинга Asp.Net Core. ASP.NET Core использует переменную среды «ASPNETCORE_ENVIRONMENT» для определения текущей среды. По умолчанию, если вы запускаете свое приложение без установки этого значения, оно автоматически будет по умолчанию настроено на рабочую среду и использует файл AppSetting.production.json. Когда вы отлаживаете через Visual Studio, он устанавливает среду разработки, поэтому он использует «AppSetting.json». Посетите этот веб-сайт, чтобы понять, как установить переменную среды хостинга в Windows.

App.config:

App.config - это еще один файл конфигурации, используемый .NET, который в основном используется для Windows Forms, служб Windows, консольных приложений и приложений WPF. При запуске хостинга Asp.Net Core через консольное приложение также используется app.config.


TL; DR

Выбор файла конфигурации определяется средой хостинга, которую вы выбираете для данной услуги. Если вы используете IIS для размещения своей службы, используйте файл Web.config. Если вы используете любую другую среду размещения, используйте файл App.config. См. Настройка служб с использованием файлов конфигурации, документация а также проверьте Конфигурация в ASP.NET Core.

0 голосов
/ 24 мая 2011

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

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

ПРИМЕР пользовательского кэша:

public enum ConfigurationSection
{
    AppSettings
}

public static class Utility
{
    #region "Common.Configuration.Configurations"

    private static Cache cache = System.Web.HttpRuntime.Cache;

    public static String GetAppSetting(String key)
    {
        return GetConfigurationValue(ConfigurationSection.AppSettings, key);
    }

    public static String GetConfigurationValue(ConfigurationSection section, String key)
    {
        Configurations config = null;

        if (!cache.TryGetItemFromCache<Configurations>(out config))
        {
            config = new Configurations();
            config.List(SNCLavalin.US.Common.Enumerations.ConfigurationSection.AppSettings);
            cache.AddToCache<Configurations>(config, DateTime.Now.AddMinutes(15));
        }

        var result = (from record in config
                      where record.Key == key
                      select record).FirstOrDefault();

        return (result == null) ? null : result.Value;
    }

    #endregion
}

namespace Common.Configuration
{
    public class Configurations : List<Configuration>
    {
        #region CONSTRUCTORS

        public Configurations() : base()
        {
            initialize();
        }
        public Configurations(int capacity) : base(capacity)
        {
            initialize();
        }
        public Configurations(IEnumerable<Configuration> collection) : base(collection)
        {
            initialize();
        }

        #endregion

        #region PROPERTIES & FIELDS

        private Crud _crud; // Db-Access layer

        #endregion

        #region EVENTS
        #endregion

        #region METHODS

        private void initialize()
        {
            _crud = new Crud(Utility.ConnectionName);
        }

        /// <summary>
        /// Lists one-to-many records.
        /// </summary>
        public Configurations List(ConfigurationSection section)
        {
            using (DbCommand dbCommand = _crud.Db.GetStoredProcCommand("spa_LIST_MyConfiguration"))
            {
                _crud.Db.AddInParameter(dbCommand, "@Section", DbType.String, section.ToString());

                _crud.List(dbCommand, PopulateFrom);
            }

            return this;
        }

        public void PopulateFrom(DataTable table)
        {
            this.Clear();

            foreach (DataRow row in table.Rows)
            {
                Configuration instance = new Configuration();
                instance.PopulateFrom(row);
                this.Add(instance);
            }
        }

        #endregion
    }

    public class Configuration
    {
        #region CONSTRUCTORS

        public Configuration()
        {
            initialize();
        }

        #endregion

        #region PROPERTIES & FIELDS

        private Crud _crud;

        public string Section { get; set; }
        public string Key { get; set; }
        public string Value { get; set; }

        #endregion

        #region EVENTS
        #endregion

        #region METHODS

        private void initialize()
        {
            _crud = new Crud(Utility.ConnectionName);
            Clear();
        }

        public void Clear()
        {
            this.Section = "";
            this.Key = "";
            this.Value = "";
        }
        public void PopulateFrom(DataRow row)
        {
            Clear();

            this.Section = row["Section"].ToString();
            this.Key = row["Key"].ToString();
            this.Value = row["Value"].ToString();
        }

        #endregion
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...