Изменение App.config во времени выполнения

Я пишу тесту WinForms / C#/.NET 3,5 приложения для системы, которую мы разрабатываем, и мы упали в потребности переключиться между .config файлами во времени выполнения, но это оказывается кошмаром.

Вот сцена: приложение WinForms нацелено на тестирование WebApp, разделенного на 5 подсистем. Тестовые работы процесса с сообщениями, отправляемыми между подсистемами, и чтобы этот процесс был успешен каждая подсистема, добрались, чтобы иметь ее собственный .config файл.

Для моего Тестового приложения я записал 5 отдельных конфигурационных файлов. Мне жаль, что я не смог переключиться между этими 5 файлами во время времени выполнения, но проблема: Я могу программно отредактировать приложение .config файл многочисленные времена, но эти изменения только вступят в силу однажды. Я искал долгое время форму для рассмотрения этой проблемы, но я все еще не был успешен.

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

Заранее спасибо!

---ОБНОВИТЕ 06.01.10---

Существует что-то, что я не упоминал прежде. Первоначально, наша система является веб-приложением с вызовами WCF между каждой подсистемой. По причинам тестирования производительности (мы используем МУРАВЬЕВ 4), мы должны были создать локальную копию блоков и сослаться на них от тестового проекта. Это может звучать как немного неправильное, но мы не могли найти удовлетворяющий способ измерить уровень удаленного приложения.

---Обновление конца---

Вот то, что я делаю:

public void UpdateAppSettings(string key, string value)
{
    XmlDocument xmlDoc = XmlDocument.Load(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);

    foreach (XmlElement item in xmlDoc.DocumentElement)
    {
        foreach (XmlNode node in item.ChildNodes)
        {
            if (node.Name == key)
            {
                node.Attributes[0].Value = value;
                break;
            }
        }
    }

    xmlDoc.Save(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);

    System.Configuration.ConfigurationManager.RefreshSection("section/subSection");    
}
7
задан davmos 16 September 2014 в 09:36
поделиться

3 ответа

UPDATE

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

Решение показано здесь. http://web-beta.archive.org/web/20150107004558/www.devnewsgroups.net/group/microsoft.public.dotnet.xml/topic40736.aspx


Старые вещи ниже

Попробуйте это:

Обратите внимание, я поменял xpath, но прошло некоторое время, так что я мог получить xpath неправильно, но в любом случае вы должны использовать xpath и не ходить по дереву. Как видите, это гораздо понятнее.

Важным моментом является утверждение , использующее , которое будет dispose(), что, я думаю, было вашей проблемой.

Дайте мне знать, удачи.

  public void UpdateAppSettings(string key, string value)
  {
    using (XmlDocument xmlDoc = new XmlDocument())
    {
      xmlDoc.Load(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);
      xmlDoc.DocumentElement.FirstChild.SelectSingleNode("descendant::"+key).Attributes[0].Value = value;
      xmlDoc.Save(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);
    }
    System.Configuration.ConfigurationManager.RefreshSection("section/subSection");
  }
3
ответ дан 6 December 2019 в 06:14
поделиться
[

]Предположим, что после прочтения и обработки конфигурационного файла рукоятка файла закрыта, я отправлю приложению сообщение о необходимости повторного прочтения конфигурационного файла после того, как вы его обновили. Если такой подход не работает, то я подозреваю (как предположил Хоган), что файловая оболочка не закрыта. Какие коды ошибок вы получаете при открытии, чтении и закрытии файла? (используйте [] perror [], чтобы сообщить об ошибке) [

].
0
ответ дан 6 December 2019 в 06:14
поделиться
[

] Думаю, что вы не закрываете файловую обработку в первый раз, чтобы окна не "видели", как вы вносите последующие изменения.[

] [

]Мои предложения - использовать вызов API в IIS и выключить веб-приложение (и пул), внести изменения, включить веб-приложение. Таким образом вы будете уверены, что оно будет перечитывать файл и иметь "чистое" окружение для каждого теста.[

].
1
ответ дан 6 December 2019 в 06:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: