NameValueSectionHandler - 我可以使用此节类型写回应用程序配置文件吗?

时间:2009-07-19 07:51:39

标签: c# .net app-config

回到主题为什么没有.net提供简单(我不想实现“ConfigurationSection”“ConfigurationElement”“ConfigurationProperty”为2个值)的方式来回写值进入应用配置文件...... (我不想使用'用户'app config)

我想写app.config值,我厌倦了上面的键,值的方法 - 读取它的罚款,但我不能写回来(它说集合是只读的)。 即使提供了以下方法 -

NameValueCollection.Set(string,string)
我在这里错过了一些东西吗?

这是我尝试这样做的方式:

 NameValueCollection nvc = (NameValueCollection)ConfigurationManager.GetSection("options");
 nvc.Set("SelectTimeOut", sqlTimeoutSpinBox.Value.ToString());

2 个答案:

答案 0 :(得分:2)

  • 不 - NameValueSectionHandler不帮助用户“创建”将写入app.config文件的Xml。

启动反射器并在System.Configuration.NameValueSectionHandler上查看以下方法:内部静态对象CreateStatic(对象父级,XmlNode节,字符串keyAttriuteName,字符串valueAttributeName)。

来自Microsoft Online社区支持的Linda Liu提供了一些关于NameValueSectionHandler,IConfigurationSectionHandler的一些很好的信息,以及为什么在EggHeadCafe论坛的讨论中从Configuration.GetSection(字符串)返回DefaultSection实例:Backwards compatibility of System.Configuration.Configuration

技术上可以阅读并创建此信息,但我建议您不要因为在极低级别的Configuration API中进行交互而使自己更加痛苦。请仅使用以下代码 教育 。我强烈建议您使用其中一种方法,例如使用声明式样式提到的Richard来创建自定义ConfigurationSection

<强>的app.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <section name="SingleTag" type="System.Configuration.SingleTagSectionHandler"/>
    </configSections>
    <SingleTag scheme="https" server="webmail.contoso.com" domain="CONTOSO" username="jdoe" password="iTz@s3Cr3t!"/>
</configuration>`

可以阅读此配置部分,但这对您的心理健康状况不利。

示例C#代码 - 将其粘贴在您的void Main(string [] args)中并吸烟。

// Read configuration
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
ConfigurationSection readableSection = config.GetSection("SingleTag");
string readableSectionRawXml = readableSection.SectionInformation.GetRawXml();
XmlDocument readableSectionRawXmlDocument = new XmlDocument();
readableSectionRawXmlDocument.Load(new StringReader(readableSectionRawXml));
SingleTagSectionHandler readableSectionHandler = new SingleTagSectionHandler();
Hashtable result = (Hashtable)readableSectionHandler.Create(null, null, readableSectionRawXmlDocument.DocumentElement);
foreach (string item in result.Keys)
{
    Console.WriteLine("{0}\t=\t{1}", item, result[item]);
}

// Create similar configuration section
Hashtable mySettings = new Hashtable();
mySettings.Add("key1", "value1:" + DateTime.Now);
mySettings.Add("key2", "value2:" + DateTime.Now);
mySettings.Add("key3", "value3:" + DateTime.Now);
mySettings.Add("keynull", null);
mySettings.Add("key4", "value4:" + DateTime.Now);
string rawData = string.Empty;
XmlDocument writableSectionXmlDocument = new XmlDocument();
XmlElement rootElement = writableSectionXmlDocument.CreateElement("CreateSingleTag");
foreach (var item in mySettings.Keys)
{
    if (mySettings[item] != null)
    {
        rootElement.SetAttribute(item.ToString(), mySettings[item].ToString());
    }
}
writableSectionXmlDocument.AppendChild(rootElement);

if (config.Sections.Get("CreateSingleTag") == null)
{
    ConfigurationSection writableSection = new DefaultSection();
    writableSection.SectionInformation.SetRawXml(writableSectionXmlDocument.OuterXml);
    config.Sections.Add("CreateSingleTag", writableSection);
}
else
{
config.Sections["CreateSingleTag"].SectionInformation.SetRawXml(writableSectionXmlDocument.OuterXml);
}

config.Save();

为了完整起见 - 你需要以下用途

using System;
using System.Collections;
using System.Configuration;
using System.IO;
using System.Xml;

以及至少对以下程序集的引用

System
System.Configuration
System.Xml

答案 1 :(得分:1)

您需要以正确的方式加载配置文件。而不是使用ConfigurationManager的静态属性使用方法来加载。

此外,您还需要确保管理全局,应用程序,用户漫游和用户本地配置之间的差异。通常只有最后两个应该是可写的。

用于将更改写入使用配置文件的一些测试代码:

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
TestConfigData data = (TestConfigData)config.GetSection("testConfigData");
++data.Data;
config.Save(ConfigurationSaveMode.Minimal);

TestConfigDate是自定义配置类型:

using System;
using System.Configuration;
using System.Text;

namespace CustomConfiguration {
  public class TestConfigData : ConfigurationSection {

    [ConfigurationProperty("Name", IsRequired=true)]
    public string Name {
      get {
        return (string)this["Name"];
      }
      set {
        this["Name"] = value;
      }
    }

    [ConfigurationProperty("Data", IsRequired=false),
     IntegerValidator(MinValue=0)]
    public int Data {
      get {
        return (int)this["Data"];
      }
      set {
        this["Data"] = value;
      }
    }
  }
}

配置文件包含,注意allowExeDefinition元素上的section属性,用于定义用户配置文件并覆盖 app.exe.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="testConfigData"
             type="CustomConfiguration.TestConfigData, CustomConfiguration"
             allowExeDefinition="MachineToLocalUser"/>
  </configSections>

  <testConfigData Name="Fubar" Data="0"/>
</configuration>