2010-03-03 3 views
5

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

+0

парню, который редактировал мои метки. Это не имеет никакого отношения к ASP.Net. Мой сервис-хост - консольное приложение. –

+1

Достаточно честный, но он по-прежнему.net - риск неправильного пометки вопросов заключается в том, что другие люди помечают его для вас, и они ошибаются :) – skaffman

ответ

0

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

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

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

9

2 вещи:

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

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

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

+0

ConfigurationManage.RefreshSection («configuration») не помог мне ... Я работал над этим используя Application.Restart() после сохранения изменений в Configuration (PS Обратите внимание, что Application.Restart() необходимо вызывать из Program.Main() в противном случае после перезапуска приложение будет запущено в 2 экземплярах) – Prokurors

+0

Я проверял, что, к сожалению, невозможно запустите RefreshSection в «конфигурации». – SondreB

Смежные вопросы