C# обновление элемента app.config
У меня есть сервер WCF, который имеет следующий файл app.config:
<?xml version="1.0"?>
<configuration>
<system.serviceModel>
<services>
<service name="MyService" behaviorConfiguration="DiscoveryBehavior">
<endpoint address="net.tcp://192.168.150.130:44424/ServerService/"/>
<endpoint name="udpDiscovery" kind="udpDiscoveryEndpoint"/>
</service>
</services>
</system.serviceModel>
</configuration>
При установке на другой компьютер, я хочу, чтобы он автоматически обновлял адрес с адресом этой машины. У меня есть строка, но я не понимаю, как обновить элемент "address" в файле app.config. У меня есть следующий код, но это не работает:
var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.AppSettings.Settings["address"].Value = "new_value";
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("appSettings");
Я думаю, это не работает, потому что у меня нет раздела с именем "appSettings", но как получить доступ к этому элементу "address"? Я пробовал разные решения, но ничего не работает.
Заранее спасибо.
2 ответа
Решение
Я нашел решение, которое работает. Прочитайте весь файл в памяти, найдите узел, замените значение и перезапишите файл. Это вызывается в методе OnStartup до инициализации моей программы.
XmlDocument doc = new XmlDocument();
doc.Load("MyApp.exe.config");
XmlNodeList endpoints = doc.GetElementsByTagName("endpoint");
foreach (XmlNode item in endpoints)
{
var adressAttribute = item.Attributes["address"];
if (!ReferenceEquals(null, adressAttribute))
{
adressAttribute.Value = string.Format("net.tcp://{0}:44424/ServerService/", MachineIp);
}
}
doc.Save("MyApp.exe.config");
Я обычно удаляю ключ и добавляю его обратно, чтобы убедиться:
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.AppSettings.Settings.Remove("address");
config.AppSettings.Settings.Add("address", "new_value");
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("appSettings");