Я пытаюсь изменить имя базы данных в строке подключения, расположенной в App.Config нашего сервисного хоста, во время выполнения и перезапустить его после подключения к другой базе данных. Это работает нормально, но только если приложение закрыто на несколько секунд. Завершение работы приложения на несколько секунд, по-видимому, очищает кэш ConfigurationManager.Connectionstrings. Проблема в том, что из-за этого необходимого времени выключения я не могу использовать Application.Restart () в своем приложении.
Странная вещь в этом поведении кэширования состоит в том, что даже когда значение обновляется в памяти (в примере, когда оно запрашивается второй раз), обновленное значение отображается правильно. Но когда приложение перезапускается, кажется, что старое значение снова появляется.
Чтобы проверить поведение, создайте новое консольное приложение.
добавить файл App.Config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add name="DomainDBConnectionString" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=InitialDBName;Integrated Security=SSPI;" />
</connectionStrings>
</configuration>
затем добавьте следующий код в метод Main
ConfigurationManager.RefreshSection("connectionStrings");
DbConnectionStringBuilder builder = new DbConnectionStringBuilder();
Configuration appConfig = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
builder.ConnectionString = appConfig.ConnectionStrings.ConnectionStrings["DomainDBConnectionString"].ConnectionString;
//print initial value
Console.WriteLine("initial " + (string)builder["Initial Catalog"]);
//change value
builder["Initial Catalog"] = "ChangedDatabaseName";
appConfig.ConnectionStrings.ConnectionStrings.Remove("DomainDBConnectionString");
appConfig.ConnectionStrings.ConnectionStrings.Add(new ConnectionStringSettings("DomainDBConnectionString", builder.ConnectionString));
appConfig.ConnectionStrings.SectionInformation.ForceSave = true;
appConfig.Save(ConfigurationSaveMode.Full);
ConfigurationManager.RefreshSection("connectionStrings");
Console.ReadLine();
DbConnectionStringBuilder builder2 = new DbConnectionStringBuilder();
Configuration appConfig2 = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
builder2.ConnectionString = appConfig.ConnectionStrings.ConnectionStrings["DomainDBConnectionString"].ConnectionString;
Console.WriteLine("changed " + (string)builder2["Initial Catalog"]);
Console.ReadLine();
Чтобы воспроизвести это поведение, вам нужно запустить приложение (нажав F5) и закрыть его.
после этого файл solutionname.exe.config будет отображаться с измененным значением.
Если вы запустите приложение во второй раз ( на этот раз, дважды щелкнув solutionname.exe ), вы заметите разницу в поведении, если вы сделаете это сразу после завершения приложения или после того, как вы подождали пару секунд .
По моему мнению, раздел конфигурации должен быть перечитан из-за
ConfigurationManager.RefreshSection ( "ConnectionStrings");
но, по-видимому, это не работает так, как рекламируется.