2011-09-11 90 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示例中是缺少的。 –

相關問題