【问题标题】:how can i clear the configurationmanager cache for connectionstrings如何清除连接字符串的配置管理器缓存
【发布时间】:2011-01-23 05:29:58
【问题描述】:

我正在尝试在运行时更改位于我们服务主机的 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"); 但显然这并不像宣传的那样有效。

【问题讨论】:

  • 致编辑我标签的人。这与 ASP.Net 无关。我的 servicehost 是一个控制台应用程序。
  • 很公平,但它仍然是 .net - 未正确标记问题的风险是其他人会为您标记它,他们会弄错 :)

标签: .net runtime configurationmanager connection-string


【解决方案1】:

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

如果我从 bin/debug 目录运行应用程序,似乎不存在缓存问题。

对于我的生产环境,这将解决我的问题(换句话说,我的问题已解决)。然而,这并没有消除我对行为差异原因的好奇。

【讨论】:

    【解决方案2】:

    两件事:

    首先,当您处于调试模式时,您没有使用solutionname.exe.config;您实际上正在使用solutionname.vshost.exe.config,这就是为什么您的行为不一致的原因,因为一旦您停止应用程序,solutionname.vshost.exe.config 文件就会恢复到原始版本;丢失您对其所做的任何更改。

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

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

    【讨论】:

    • ConfigurationManage.RefreshSection("configuration") 对我没有帮助...我在保存对 Configuration 的更改后使用 Application.Restart() 解决了这个问题(注意 Application.Restart() 有要从 Program.Main() 调用,否则在重新启动后应用程序将在 2 个实例中启动)
    • 我已经验证,很遗憾不可能在“配置”上运行 RefreshSection。
    猜你喜欢
    • 2016-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-13
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 2016-08-29
    相关资源
    最近更新 更多