Подтвердить что ты не робот

Объединение web.configs между проектами

У меня есть общий веб-проект, который используется как основа для нескольких "дочерних" веб-проектов. Можно ли применить преобразование/слияние web.config между проектами? Скажем, структура выглядит так:

base project
  - web.config

child project
  - web.config
    - transform.config

Можно ли создать событие предварительной сборки или подобное, которое объединяет базовый проект web.config с дочерним проектом web.config?

4b9b3361

Ответ 1

Вы можете редактировать в отдельный файл (transform.config) [1], [2] и:

Добавьте раздел <appsettings> и добавьте свои данные в качестве пары ключ/значение формы:

<add key="xxx" value="xxxx" />

Чтобы создать новый файл app.config с настройками в нем.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="Child1" value="Child1_Value" />
    <add key="Child2" value="Child2_Value" />
  </appSettings>
</configuration>

И то же самое для строки подключения [3]:

<connectionStrings>
    <add name="yourConnectionStringName" 
         connectionString="yourConnectionString" 
         providerName="System.Data.SqlClient"/>
</connectionStrings>

И используйте configSource для родительского файла:

<connectionStrings configSource="parentWeb.config"/>

Ответ 2

Недавно я столкнулся с такой проблемой - хотя я пытался программно объединить два файла web.config во время выполнения.

Следующий код работает частично, для разделов AppSettings и Settings (необходимо добавить ConnectionStrings), для времени сборки вы можете обернуть его в исполняемый файл:

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        var p = Server.MapPath("~/Web.user.config");
        if (File.Exists(p))
        {
            var fileMap = new ConfigurationFileMap(p); //Path to your config file
            var userConfig = ConfigurationManager.OpenMappedMachineConfiguration(fileMap);

            var globalConfig = WebConfigurationManager.OpenWebConfiguration("~/");
            var globalGroups = globalConfig.SectionGroups.Cast<ConfigurationSectionGroup>().ToList();

            CopySections(userConfig.Sections.Cast<ConfigurationSection>(), globalConfig.Sections.Cast<ConfigurationSection>());

            foreach (ConfigurationSectionGroup userGroup in userConfig.SectionGroups)
            {
                var globalGroup =  globalGroups.SingleOrDefault(g => g.SectionGroupName == userGroup.SectionGroupName);
                if (globalGroup != null)
                {
                    CopySections(userGroup.Sections.Cast<ConfigurationSection>(), globalGroup.Sections.Cast<ConfigurationSection>());
                }
            }

            globalConfig.Save();

        }
    }

    private void CopySections(IEnumerable<ConfigurationSection> source, IEnumerable<ConfigurationSection> target)
    {
        foreach (var sourceSection in source)
        {
            var targetSection = target.SingleOrDefault(s => s.SectionInformation.SectionName == sourceSection.SectionInformation.SectionName);
            if (targetSection != null)
            {
                var targetAppSettings = targetSection as AppSettingsSection;
                if (targetAppSettings != null)
                {
                    var sourceAppSettings = (AppSettingsSection) sourceSection;
                    foreach (KeyValueConfigurationElement keyValue in sourceAppSettings.Settings)
                    {
                        var targetSettings = targetAppSettings.Settings;

                        if (targetSettings.AllKeys.Any(k => k == keyValue.Key))
                        {
                            targetSettings.Remove(keyValue.Key);
                        }

                        targetSettings.Add(keyValue);
                    }
                }

                var targetClientSettings = targetSection as ClientSettingsSection;
                if (targetClientSettings != null)
                {
                    var sourceClientSettings = (ClientSettingsSection) sourceSection;
                    foreach (SettingElement keyValue in sourceClientSettings.Settings)
                    {
                        var targetSettings = targetClientSettings.Settings;
                        var existingSetting = targetSettings.Cast<SettingElement>().SingleOrDefault(e => e.Name == keyValue.Name);
                        if (existingSetting != null)
                        {
                            existingSetting.Value = keyValue.Value;
                        }
                    }
                }
            }
        }
    }