2010-03-03 27 views
5

我试图在位于我们在运行时的ServiceHost的App.Config中ConnectionString,以更改数据库名称,之后重新启动它连接到另一个数据库ConfigurationManager中缓存。这工作正常,但只有当应用程序关闭多秒。关闭几秒钟的应用程序似乎清除了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> 

然后将下面的代码添加到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文件将显示修改后的值。 如果您第二次运行该应用程序(此时双击解锁名称.exe,则此时为),如果您在终止应用程序后立即执行此操作,或等待几秒钟后立即执行此操作,您将注意到行为上的差异。

在我看来,configsection应该重新阅读,因为 ConfigurationManager.RefreshSection(“connectionStrings”); 但apparenatelly这不起作用广告。

+0

给编辑我的标签的人。这与ASP.Net无关。我的服务器是一个控制台应用程序。 – 2010-03-03 15:27:05

+1

够公平的,但它仍然。净 - 没有正确标记问题的风险是,其他人会标记它给你,他们会得到错误:) – skaffman 2010-03-04 11:42:19

回答

0

这个问题似乎存在于第一次,我从Visual Studio运行应用程序(启用调试器)。

如果我从运行的bin /调试目录中的应用程序似乎缓存问题不存在。

对于我的生产环境,这将解决我的问题(因此,换句话说,我的问题是固定的)。然而,这并不能消除我对行为差异原因的好奇心。

9

两两件事:

首先,当你在你不使用solutionname.exe.config调试模式;您实际上使用的是solutionname.vshost.exe.config,这就是为什么您的行为不一致的原因,因为solutionname.vshost.exe.config文件一旦停止应用程序就会回到原始版本;失去你对它所做的任何改变。

秒这行代码ConfigurationManager.RefreshSection("connectionStrings"); 并不总是按预期工作。我发现有时候更好地刷新父节或节组;在这种情况下将是“配置”。

所以尝试ConfigurationManager.RefreshSection("configuration");

+0

ConfigurationManage.RefreshSection(“配置”)没有帮助我...我解决了这个使用Application.Restart()保存对配置(PS注意,必须从Program.Main()调用Application.Restart(),否则在重启应用程序将在两个实例中启动) – Prokurors 2014-03-27 11:37:23

+0

我已验证,它不幸是不可能的在“配置”上运行RefreshSection。 – SondreB 2014-08-28 08:25:46