【问题标题】:Unrecognized element exception with custom C# config自定义 C# 配置无法识别的元素异常
【发布时间】:2011-11-14 21:20:06
【问题描述】:

我在 .NET 3.5 Windows 服务的 App.config 中有以下位:

<configSections>
    <section name="ConfigurationServiceSection" type="SomeApp.Framework.Configuration.ConfigurationServiceSection, SomeApp.Framework"/>
</configSections>

<ConfigurationServiceSection configSource="ConfigSections\configurationServiceSection.config" />

我在 configurationServiceSection.config 中有这个:

<ConfigurationServiceSection>
    <ConfigurationServices>
        <ConfigurationService name="LocalConfig" host="localhost" port="40001" location="LON"/>
    </ConfigurationServices>
</ConfigurationServiceSection>

这是代码:

using System.Configuration;

namespace SomeApp.Framework.Configuration
{
    public sealed class ConfigurationServiceSection : ConfigurationSection
    {
        [ConfigurationProperty("ConfigurationServices", IsDefaultCollection = true, IsRequired = true)]
        [ConfigurationCollection(typeof(ConfigurationServices))]
        public ConfigurationServices ConfigurationServices
        {
            get
            {
                return (ConfigurationServices)base["ConfigurationServices"];
            }
        }
    }

    public sealed class ConfigurationServices : ConfigurationElementCollection
    {
        protected override ConfigurationElement CreateNewElement()
        {
            return new ConfigurationService();
        }

        protected override object GetElementKey(ConfigurationElement element)
        {
            ConfigurationService configService = (ConfigurationService) element;
            return configService.Name;
        }
    }

    public sealed class ConfigurationService : ConfigurationElement
    {
        /// <summary>
        /// name
        /// </summary>
        [ConfigurationProperty("name", IsKey = true, IsRequired = true)]
        public string Name
        {
            get { return (string)this["name"]; }
            set { this["name"] = value; }
        }

        /// <summary>
        /// host
        /// </summary>
        [ConfigurationProperty("host", IsKey = false, IsRequired = true)]
        public string Host
        {
            get { return (string)this["host"]; }
            set { this["host"] = value; }
        }

        /// <summary>
        /// port
        /// </summary>
        [ConfigurationProperty("port", IsKey = false, IsRequired = true)]
        public string Port
        {
            get { return (string)this["port"]; }
            set { this["port"] = value; }
        }

        /// <summary>
        /// location
        /// </summary>
        [ConfigurationProperty("location", IsKey = false, IsRequired = true)]
        public string Location
        {
            get { return (string)this["location"]; }
            set { this["location"] = value; }
        }
    }
}

当我尝试使用以下内容访问配置时:

var configurationServiceSection = (ConfigurationServiceSection)configuration.GetSection("ConfigurationServiceSection");

我得到了这个例外:

Unrecognized element 'ConfigurationService'. (C:\Code\branches\ConfigurationService\SomeApp\Src\ConfigService\SomeApp.ConfigService.WindowsService\bin\Debug\ConfigSections\configurationServiceSection.config line 3)

在我看来一切都井井有条?

有什么想法吗?谢谢。

【问题讨论】:

标签: c# .net-3.5 windows-services custom-configuration


【解决方案1】:

好的,到此为止:

我在 ConfigurationServiceSection 类中添加了“AddItemName”,如下所示:

public sealed class ConfigurationServiceSection : ConfigurationSection
{
    [ConfigurationProperty("ConfigurationServices", IsDefaultCollection = true, IsRequired = true)]
    [ConfigurationCollection(typeof(ConfigurationServices), AddItemName = "ConfigurationService")]
    public ConfigurationServices ConfigurationServices
    {
        get
        {
            return (ConfigurationServices)base["ConfigurationServices"];
        }
    }
}

另一种方法是覆盖 CollectionType 和 ElementName 属性,如下所示:

public override ConfigurationElementCollectionType CollectionType
{
    get { return ConfigurationElementCollectionType.BasicMap; }
}

protected override string ElementName
{
    get { return "ConfigurationService"; }
}

【讨论】:

  • 告诉我它是“返回 ConfigurationElementCollectionType.BasicMap;”我需要将其更改为“返回 ConfigurationElementCollectionType.AddRemoveClearMap;”但这篇文章帮助我找到了答案!
  • 这个 AddItemName 解决方案非常明显。很直观。很容易被发现。设计配置框架,使 xml 结构类似于您的对象模型,直到您尝试将项目添加到集合中,此时您使用 xml 元素 而不是对象类型/名称。这会让他们一直在猜测。大约 6 小时。
  • 在集合类中覆盖 ElementName 是让它为我工作的关键部分。设置 AddItemName 是不够的。不用说,这在 MSDN 示例中是缺失的。
猜你喜欢
  • 2016-01-17
  • 2011-06-26
  • 2015-04-29
  • 2021-09-18
  • 1970-01-01
  • 2023-03-07
  • 2014-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多