Загрузить файл конфигурации из потока вместо файла - PullRequest
5 голосов
/ 02 ноября 2010

Я использую OpenMappedExeConfiguration с ExeConfigurationFileMap для загрузки файлов конфигурации.Их перегрузки предполагают, что они работают только с именами файлов.Есть ли способ загрузить файл конфигурации из потока?

Справочная информация: Я хочу загрузить файлы конфигурации, которые хранятся как встроенные ресурсы.Нет представления файла!

Ответы [ 2 ]

6 голосов
/ 02 ноября 2010

Нет. Проблема в том, что этот класс сам не читает конфигурацию. Путь к файлу в конечном итоге используется классом Configuration для загрузки конфигурации, и этот класс на самом деле хочет физический путь.

Я думаю, что единственное решение - сохранить файл во временном пути и прочитать его оттуда.

4 голосов
/ 17 ноября 2010

Да. Если вашему приложению разрешено изменять файлы в папке приложения - обновите файл *.config, с помощью операций ввода-вывода файла или с помощью раздела "1004 * / save / refresh"В этом решении есть прямая логика - хотите иметь удаленную настройку?Получить его из удаленного, обновить локальный и иметь его.

Пример: допустим, вы сохранили группу вашего wcf группы (<bindings>, <behaviors> .. и т.д.) в файле wcfsections.test.config (конечно, любойудаленный источник возможен) и хочется "перегрузить" конфигурацию файла conf.Тогда код обновления / сохранения / обновления конфигурации выглядит следующим образом:

        Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        ConfigurationSectionCollection sections = ServiceModelSectionGroup.GetSectionGroup(config).Sections;
        sections.Clear();

        string fileName = ((GeneralSettings)ConfigurationManager.GetSection("generalSettings")).AppConfigServiceModelSectionFile;

        XDocument doc = XDocument.Load(fileName);
        var xmlGroup = (from x in doc.Descendants("system.serviceModel") select x).FirstOrDefault();

        string[] sectionsInUpdateOrder = { "bindings", "comContracts", "behaviors", "extensions", "services", "serviceHostingEnvironment", "client", "diagnostics" };
        foreach (string key in sectionsInUpdateOrder)
        {
            var e = (from x in xmlGroup.Elements(key) select x).FirstOrDefault();
            if (e != null)
            {
                ConfigurationSection currentSection = sections[e.Name.LocalName];
                string xml = e.ToString();
                currentSection.SectionInformation.SetRawXml(xml);
            }
        }
        config.Save();
        foreach (string key in sectionsInUpdateOrder)
            ConfigurationManager.RefreshSection("system.serviceModel/" + key);

Примечание. Порядок обновлений важен для подсистемы проверки wcf.Если вы обновите его в неправильном порядке, вы можете получить исключения из проверки.

...