Чтение настроек из отдельного файла конфигурации

В моем приложении asp.net используется web.config для общей конфигурации. У меня также есть раздел, который сопоставляет некоторые объекты данных со строками подключения, и этот раздел будет состоять из пары тысяч строк. Я хочу переместить этот раздел в другой файл конфигурации «dataMappings.config», чтобы не перегружать web.config - существует ли стандартный механизм доступа к этому файлу конфигурации?

Спасибо, Андрей


person Andrey    schedule 09.02.2010    source источник


Ответы (2)


В каждом разделе вы можете определить configSource, который может указывать на путь к внешнему файлу. Вот простой пример:

<connectionStrings configSource="myConnectionStrings.Config" />
<appSettings configSource="myAppSettings.Config" />

Только убедитесь, что вы не используете расширение .xml, поскольку его можно просматривать в браузере. .config не будет обслуживаться веб-сервером.

Поскольку ваши разделы конфигурации по-прежнему определены в web.config (таким образом, указывая на внешние файлы), вы можете получить доступ к этой информации через обычные маршруты (WebConfigurationManager.AppSettings, WebConfigurationManager.GetSection, ConfigurationManager или обработчики настраиваемых разделов по мере необходимости)

person KP.    schedule 09.02.2010
comment
Будет ли работать, если я использую кастомный раздел? Или мне нужно что-то сделать в этом настраиваемом коде раздела для поддержки атрибута configSource? - person Andrey; 09.02.2010
comment
@Andrey: это будет работать с любыми ConfigurationSection в .NET 2.0 и выше. - person marc_s; 09.02.2010
comment
Он должен работать. Вот еще одно обсуждение этого вопроса: stackoverflow.com/questions/398607/ - person KP.; 09.02.2010

Я использовал помощник по настройке в общей DLL и файл app.config в DLL, который использует материал Settings.Properties.Default, отредактировав проект и установив вкладку настроек. Похоже, что значение не считывается, если вы не перекомпилируете и не синхронизируете app.config (в dll) с настройками проекта.

У меня это работает. Не помню, откуда я черпал вдохновение. Я просто включаю этот класс где-нибудь в общий проект. позволяет любой DLL вызывать свои собственные настройки, что позволяет изменять записи dllFile.dll.config. Я использую это для строк подключения. Предостережение заключается в том, что в этом методе строка подключения должна быть строкой типа, а не специальной строкой подключения.

using System;
using System.Configuration;

namespace Shared
{
    public static class ConfigurationHelper
    {
        public static string GetConfigValue(string keyName)
        {
            string codebase = System.Reflection.Assembly.GetCallingAssembly().CodeBase;  
            Uri p = new Uri(codebase);
            string localPath = p.LocalPath.ToLowerInvariant();
            string executingFilename = System.IO.Path.GetFileNameWithoutExtension(localPath);
            string sectionGroupName = "applicationSettings";
            string sectionName = executingFilename + ".Properties.Settings";
            string configName = localPath + ".config";
            ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
            fileMap.ExeConfigFilename = configName;
            Configuration config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
            ConfigurationSectionGroup group = config.GetSectionGroup(sectionGroupName);
            ClientSettingsSection section = null;
            foreach (ClientSettingsSection sect in group.Sections)
            {
                if (sect.SectionInformation.Name.Equals(sectionName, StringComparison.InvariantCultureIgnoreCase))
                {
                    section = sect;
                    break;
                }
            }
            SettingElement elem = section.Settings.Get(keyName);
            if (elem == null)
                return "";
            else
                return elem.Value.ValueXml.InnerText.Trim();
        }
    }
}

//in DLL
void foo()
{
    var str = ConfigurationHelper.GetSetting("ConnectionStringProd");
}
person realPT    schedule 13.03.2012