2011-09-11 127 views
9

我在App.config中的.NET 3.5的Windows服务中的下列位:无法识别的元素异常

<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) 

一切看起来都为了我吗?

有什么想法吗?谢谢。

+0

另请参见:[I如何解决“无法识别的元素 '的ElementName'](http://stackoverflow.com/questions/1985047/how-can-i-solve-unrecognized-element -elementname线-X线-X)。 –

回答

11

确定得的本底:

我加入“AddItemName”到ConfigurationServiceSection类,如下面:

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"; } 
} 
+0

形成我这是“返回ConfigurationElementCollectionType.BasicMap;”我需要更改为“返回ConfigurationElementCollectionType.AddRemoveClearMap;”但这篇文章帮助我得到了答案! – Dib

+0

这个AddItemName解决方案非常明显。非常直观。很好发现。设计配置框架,以便xml结构与您的对象模型相似,直到您尝试将项目添加到集合,此时您使用xml元素而不是对象类型/名称。这会让他们猜测。大约6个小时。 – 2014-09-17 18:18:11

+0

在集合类中覆盖ElementName是让我为此工作的关键部分。设置AddItemName是不够的。不用说,这在MSDN示例中是缺少的。 –

相关问题