繁体   English   中英

在运行时更改App.config

[英]Changing App.config at Runtime

我正在为我们正在开发的系统编写一个测试WinForms / C#/ .NET 3.5应用程序,由于在运行时需要在.config文件之间进行切换,但这真是一场噩梦。

场景如下:WinForms应用程序旨在测试WebApp,该WebApp分为5个子系统。 测试过程与子系统之间发送的消息配合使用,为了使该过程成功,每个子系统必须拥有自己的.config文件。

对于我的测试应用程序,我编写了5个单独的配置文件。 我希望能够在运行时在这5个文件之间切换,但是问题是:我可以通过编程方式多次编辑应用程序.config文件,但是这些更改只会生效一次。 我一直在寻找一种表格来解决这个问题,但是我仍然没有成功。

我知道问题的定义可能会有些混乱,但是如果有人帮助我,我将非常感谢。

提前致谢!

-更新01-06-10-

我之前没有提到过。 最初,我们的系统是一个Web应用程序,每个子系统之间都有WCF调用。 出于性能测试的原因(我们使用的是ANTS 4),我们必须创建程序集的本地副本,并从测试项目中引用它们。 听起来可能有些错误,但是我们找不到一种令人满意的方式来衡量远程应用程序的性能。

-结束更新-

这是我在做什么:

public void UpdateAppSettings(string key, string value)
{
    XmlDocument xmlDoc = XmlDocument.Load(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);

    foreach (XmlElement item in xmlDoc.DocumentElement)
    {
        foreach (XmlNode node in item.ChildNodes)
        {
            if (node.Name == key)
            {
                node.Attributes[0].Value = value;
                break;
            }
        }
    }

    xmlDoc.Save(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);

    System.Configuration.ConfigurationManager.RefreshSection("section/subSection");    
}

我知道这是一个很旧的线程,但是我无法使用列出的方法。 这是UpdateAppSettings方法的简化版本(使用.NET 4.0):

private void UpdateAppSettings(string theKey, string theValue)
        {
            Configuration configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
            if (ConfigurationManager.AppSettings.AllKeys.Contains(theKey))
            {
                configuration.AppSettings.Settings[theKey].Value = theValue;
            }

            configuration.Save(ConfigurationSaveMode.Modified);

            ConfigurationManager.RefreshSection("appSettings");
        }

可读性强,避免使用Xpath或类似方法遍历app.config。 注意:上面的代码是受MSDN上的代码段启发的。

更新

下面的解决方案不起作用,因为XmlDocument无法处理,并且给定文件路径时,.net的某些版本似乎无法正确关闭。 解决方案(链接中的示例代码)是打开一个流,该流将进行处理并将该流传递给save函数。

这里显示一个解决方案。 http://web-beta.archive.org/web/20150107004558/www.devnewsgroups.net/group/microsoft.public.dotnet.xml/topic40736.aspx


下面的旧东西

尝试这个:

请注意,我更改为xpath,但是已经有一段时间了,所以我可能将xpath弄错了,但是在任何情况下,您都应该使用xpath而不走树。 如您所见,它更加清晰。

重要的一点是using语句它将dispose() ,我认为这是您的问题。

让我知道,祝你好运。

  public void UpdateAppSettings(string key, string value)
  {
    using (XmlDocument xmlDoc = new XmlDocument())
    {
      xmlDoc.Load(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);
      xmlDoc.DocumentElement.FirstChild.SelectSingleNode("descendant::"+key).Attributes[0].Value = value;
      xmlDoc.Save(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);
    }
    System.Configuration.ConfigurationManager.RefreshSection("section/subSection");
  }

我的猜测是,您并不是第一次真正关闭文件句柄,因此Windows不会“看到”您在以后进行的更改。

我的建议是使用对IIS的API调用并关闭Web应用程序(和池),进行更改,然后打开Web应用程序。 这样,您可以确定它将重新读取文件,并为每个测试提供一个“干净”的环境。

假定在读取和处理了配置文件之后关闭了配置文件的文件句柄,那么我将向应用程序发送一条消息,告诉它在更新文件后重新读取配置文件。 如果这种方法不起作用,那么我怀疑(如Hogan所建议的)文件句柄没有关闭。 您从文件打开,读取和关闭系统调用中得到什么错误代码? (使用perror报告错误消息)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM