Я пытаюсь изменить имя базы данных в connectionstring, расположенном в Приложении. Конфигурация нашего servicehost во времени выполнения и перезапуске это впоследствии соединяющийся с другой базой данных. Это хорошо работает, но только если приложение закрывается в течение нескольких секунд. Закрытие приложения в течение нескольких секунд, кажется, очищает кэш ConfigurationManager. Connectionstrings. Проблема состоит в том, что из-за этого необходимого времени завершения работы, я не могу использовать Приложение. Перезапуск () в моем приложении.
Странная вещь об этом поведении кэширования состоит в том, что, даже когда значение обновляется в памяти (в примере во второй раз это требуют) обновленное значение отображено правильно. Но когда приложение перезапущено, старое значение, кажется, повторно появляется.
Для проверки поведения создают новое консольное приложение.
добавьте Приложение. Файл конфигурации
<?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), Вы заметите различие в поведении, если Вы сразу сделаете это после завершения Вашего приложения, или после ожидания нескольких секунд.
По-моему, configsection должен быть перечитан из-за ConfigurationManager. RefreshSection ("connectionStrings"); но apparenatelly это не работает, как рекламируется.
Проблема, похоже, заключается в том, что в первый раз я запускаю приложение из visual studio (с включенным отладчиком).
Если я запускаю приложение из каталога bin/debug, проблема кэширования, похоже, не существует.
Для моей производственной среды это решит мою проблему (другими словами, моя проблема решена). Однако это не избавляет меня от любопытства по поводу причины разницы в поведении.
2 вещи:
Во-первых, когда вы находитесь в режиме отладки, вы не используете solutionname.exe.config
; на самом деле вы используете solutionname.vshost.exe.config
, поэтому ваше поведение непоследовательно, потому что файл solutionname.vshost.exe.config
возвращается к исходной версии, как только вы останавливаете приложение; теряются все изменения, которые вы внесли в него.
Вторая строка кода ConfigurationManager.RefreshSection("connectionStrings");
не всегда работает так, как ожидалось. Я обнаружил, что иногда лучше обновить родительский раздел или группу разделов; в данном случае это будет "конфигурация".
попробуйте ConfigurationManager.RefreshSection("configuration");