как я могу очистить configurationmanager кэш для connectionstrings

Я пытаюсь изменить имя базы данных в 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 это не работает, как рекламируется.

5
задан skaffman 4 March 2010 в 11:41
поделиться

2 ответа

Проблема, похоже, заключается в том, что в первый раз я запускаю приложение из visual studio (с включенным отладчиком).

Если я запускаю приложение из каталога bin/debug, проблема кэширования, похоже, не существует.

Для моей производственной среды это решит мою проблему (другими словами, моя проблема решена). Однако это не избавляет меня от любопытства по поводу причины разницы в поведении.

0
ответ дан 14 December 2019 в 01:06
поделиться

2 вещи:

Во-первых, когда вы находитесь в режиме отладки, вы не используете solutionname.exe.config; на самом деле вы используете solutionname.vshost.exe.config, поэтому ваше поведение непоследовательно, потому что файл solutionname.vshost.exe.config возвращается к исходной версии, как только вы останавливаете приложение; теряются все изменения, которые вы внесли в него.

Вторая строка кода ConfigurationManager.RefreshSection("connectionStrings"); не всегда работает так, как ожидалось. Я обнаружил, что иногда лучше обновить родительский раздел или группу разделов; в данном случае это будет "конфигурация".

попробуйте ConfigurationManager.RefreshSection("configuration");

9
ответ дан 14 December 2019 в 01:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: