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");
Другие вопросы по тегам