как очистить кеш менеджера конфигурации для строк подключения - PullRequest
5 голосов
/ 03 марта 2010

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

Ответы [ 2 ]

9 голосов
/ 04 июня 2010

2 вещи:

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

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

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

0 голосов
/ 04 марта 2010

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

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

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

...