Объединение web.configs между проектами
У меня есть общий веб-проект, который используется как основа для нескольких "дочерних" веб-проектов. Можно ли применить преобразование/слияние web.config между проектами? Скажем, структура выглядит так:
base project
- web.config
child project
- web.config
- transform.config
Можно ли создать событие предварительной сборки или подобное, которое объединяет базовый проект web.config с дочерним проектом web.config?
Ответы
Ответ 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;
}
}
}
}
}
}