Как настроить конкретные конфигурационные файлы конфигурации решения?

У меня есть веб-служба, которая нуждается в разных настройках для разных сред (debug, test, prod). Каков самый простой способ установки отдельных файлов конфигурации для этих различных сред? Все, что я нахожу в интернете, говорит мне, как использовать configuration manager для получения параметров, но не как найти конкретные параметры на основе текущей конфигурации сборки.

7 ответов


Я считаю, что наличие нескольких файлов конфигурации для каждой среды работает хорошо. т. е.:

  • config\local.конечная точка.в XML
  • config\ dev.конечная точка.в XML
  • config\ test.конечная точка.в XML
  • config\ staging.конечная точка.в XML
  • config\ prod.конечная точка.в XML

затем я ссылаюсь на" главную " версию этого, используя встроенный атрибут configSource в интернете.config или app.конфигурация, такая как

<appSettings configSource="config\endpoints.xml"/>

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

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


одним из способов было бы поддерживать 3 разных файла конфигурации и выбирать их через MSBuild при развертывании.

    <Choose>
        <When Condition="$(BuildEnvironment) == 'debug'">
            <PropertyGroup>
                <ConfigFile>debug.config</ConfigFile>
            </PropertyGroup>
        </When>
        <When Condition="$(BuildEnvironment) == 'test'">
            <PropertyGroup>
                <ConfigFile>test.config</ConfigFile>
            </PropertyGroup>
        </When>
        <When Condition="$(BuildEnvironment) == 'prod'">
            <PropertyGroup>
                <ConfigFile>prod.config</ConfigFile>
            </PropertyGroup>
        </When>
    </Choose>

используя задачу MSBuild, вы можете переименовать и переместить конкретный файл конфигурации в нужное место.

все еще несколько громоздко, это имеет дополнительное преимущество перемещения к один шаг построить.


в следующей версии Visual Studio эта самая вещь была объявлена как новая функция. Возможно, вы можете сделать это в сценарии prebuild; замена файла конфигурации на основе переменной configurationname env.


еще один вариант: переключитесь на сохранение конфигурации приложения в базе данных. Я сохраняю значения типов в базе данных, чтобы управление этими параметрами было более централизованным. Тогда мой конфигурационный файл имеет строку подключения, выделенную только для Config, и имеет только два ключа: уникальное значение идентификатора приложения и версию конфигурации (т. е. "dev", "test" и т. д.). Затем я просто развертываю правильный конфигурационный файл в правильной среде.

Это может быть не совсем то, что вы ищете; это альтернатива для облегчения управления вашими данными конфигурации.


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

вместо этого у вас может быть одна основная конфигурация и использование regex / xmlpoke (nant)/[your-favorite-text-manipulator] для массажа файла во время сборки/развертывания, чтобы вставить правильные значения для каждой среды, сохраняя настройки для всех среды в другом файле (но принципиально все вместе).

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


мы используем несколько различных методов.

окружающая среда.свойство machineName.config (для пользователей)

        System.Configuration.ExeConfigurationFileMap fileMap = new System.Configuration.ExeConfigurationFileMap();

        if (System.IO.File.Exists(String.Format("./{0}.config", Environment.MachineName)))
            fileMap.ExeConfigFilename = String.Format(@"./{0}.config", Environment.MachineName);
        else
            fileMap.ExeConfigFilename = "live.config";

        System.Configuration.Configuration config = System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(fileMap, System.Configuration.ConfigurationUserLevel.None);

#Если отладка отладка.config

#Если тест тест.config

#Если прод прод.config

            System.Configuration.ExeConfigurationFileMap fileMap = new System.Configuration.ExeConfigurationFileMap();

#if (DEBUG)
            fileMap.ExeConfigFilename = "./debug.config";
#elif (TEST)
            fileMap.ExeConfigFilename = "./test.config";
#else
            fileMap.ExeConfigFilename = "./production.config";
#endif

            System.Configuration.Configuration config = System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(fileMap, System.Configuration.ConfigurationUserLevel.None);

это может стать утомительным, хотя.


использовать предварительно скомпилированные директивы. Пример кода:

        String configFile = String.Empty;
 #if Debug
        configFile = @"debug.config";
 #elif Test
        configFile = @"test.config";
 #elif Prod
        configFile = @"prod.config";
 #endif
        Load(configFile);

где метод Load загрузил файл конфигурации.