我正在尝试在运行时更改位于Servicehost的App.Config中的connectionstring中的数据库名称,然后在连接到另一个数据库后重新启动它。这样可以正常工作,但前提是应用程序关闭多秒钟。关闭应用程序几秒钟似乎清除了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”); 但似乎这并不像宣传的那样有效。
答案 0 :(得分:9)
2件事:
首先,当您处于调试模式时,您没有使用solutionname.exe.config
;您实际上正在使用solutionname.vshost.exe.config
,这就是为什么您的行为不一致,因为solutionname.vshost.exe.config
文件会在您停止应用程序后立即返回到原始版本;失去你对它所做的任何改变。
这一行代码ConfigurationManager.RefreshSection("connectionStrings");
的秒数
并不总是按预期工作。我发现刷新父节或节组有时会更好一些;在这种情况下将是“配置”。
所以请尝试ConfigurationManager.RefreshSection("configuration");
答案 1 :(得分:0)
问题似乎在于,第一次,我从visual studio运行应用程序(启用了调试器)。
如果我从bin / debug目录运行应用程序,则缓存问题似乎不存在。
对于我的生产环境,这将解决我的问题(换句话说,我的问题已修复)。然而,这并没有消除我对行为差异原因的好奇心。