Я пишу тесту 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");
}
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");
}
]Предположим, что после прочтения и обработки конфигурационного файла рукоятка файла закрыта, я отправлю приложению сообщение о необходимости повторного прочтения конфигурационного файла после того, как вы его обновили. Если такой подход не работает, то я подозреваю (как предположил Хоган), что файловая оболочка не закрыта. Какие коды ошибок вы получаете при открытии, чтении и закрытии файла? (используйте [] perror [], чтобы сообщить об ошибке) [
].] Думаю, что вы не закрываете файловую обработку в первый раз, чтобы окна не "видели", как вы вносите последующие изменения.[
] []Мои предложения - использовать вызов API в IIS и выключить веб-приложение (и пул), внести изменения, включить веб-приложение. Таким образом вы будете уверены, что оно будет перечитывать файл и иметь "чистое" окружение для каждого теста.[
].