Я пытаюсь изменить имя базы данных в строке соединения, расположенной в App.Config нашего servicehost, во время выполнения и перезапустить его, после чего подключиться к другой базе данных. Это прекрасно работает, но только если приложение отключено на несколько секунд. Выключение приложения в течение нескольких секунд, похоже, очищает кеш настроек ConfigurationManager.Connectionstrings. Проблема в том, что из-за этого требуется время отключения, я не могу использовать Application.Restart() в своем приложении.Как я могу очистить кеш конфигурационного менеджера для connectionstrings
Странная вещь, связанная с этим поведением кэширования, заключается в том, что даже когда значение обновляется в памяти (в этом примере во втором запросе) обновленное значение отображается правильно. Но когда приложение перезапускается, старое значение, похоже, снова появляется.
Чтобы проверить поведение, создайте новое консольное приложение.
добавьте 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>
затем добавьте следующий код к основной методе
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"); , но, похоже, это не работает, как рекламируется.
парню, который редактировал мои метки. Это не имеет никакого отношения к ASP.Net. Мой сервис-хост - консольное приложение. –
Достаточно честный, но он по-прежнему.net - риск неправильного пометки вопросов заключается в том, что другие люди помечают его для вас, и они ошибаются :) – skaffman