2017-02-01 2 views
0

Ich wurde beauftragt, die App.config unserer App zu erweitern, indem wir eine <configSection> erstellen, in der wir ein relativ komplexes Objekt in Xml definieren würden. Die Konfiguration sieht wie folgt aus:Was ist los mit meiner App.config?

<configuration> 
    <appSettings> 
    <add key="MinWaitTime" value="150" /> 
    <add key="MaxWaitTime" value="900" /> 
    </appSettings> 
    <configSections> 
    <section name="clientconfig" type="KeepWarm.ClientConfig" /> 
    </configSections> 
    <clientconfig username="test user" password="test password"> 
    <urls> 
     <add url="test1" /> 
     <add url="test2" /> 
     <add url="test3" /> 
    </urls> 
    </clientconfig> 
</configuration> 

Schließlich werde ich mehrere definieren zu können, haben <clientconfig>, aber ich bin zu kämpfen schon immer nur eine arbeiten.

namespace KeepWarm 
{ 
    public class ClientConfig : ConfigurationSection 
    { 
     [ConfigurationProperty("username", IsRequired = true)] 
     public string UserName 
     { 
      get { return (string)base["username"]; } 
      set { base["username"] = value; } 
     } 

     [ConfigurationProperty("password", IsRequired = true)] 
     public string Password 
     { 
      get { return (string)base["password"]; } 
      set { base["password"] = value; } 
     } 

     [ConfigurationProperty("urls", IsRequired = true)] 
     public UrlCollection Urls 
     { 
      get { return (UrlCollection)base["urls"]; } 
      set { base["urls"] = value; } 
     } 
    } 

    [ConfigurationCollection(typeof(UrlElement))] 
    public class UrlCollection : ConfigurationElementCollection 
    { 
     protected override ConfigurationElement CreateNewElement() 
     { 
      return new UrlElement(); 
     } 

     protected override object GetElementKey(ConfigurationElement element) 
     { 
      return ((UrlElement)element).Url; 
     } 
    } 

    public class UrlElement : ConfigurationElement 
    { 
     [ConfigurationProperty("url", IsKey = true, IsRequired = true)] 
     public string Url 
     { 
      get { return (string)this["url"]; } 
      set { base["url"] = value; } 
     } 
    } 
} 

Aber wenn ich versuche, meine Einstellungen zuzugreifen, wie folgt aus:

var minWaitTime = int.Parse(ConfigurationManager.AppSettings["MinWaitTime"]); 

ich eine System.Configuration.ConfigurationErrorsException bekommen.

Ich habe verschiedene Beispiele online betrachtet, aber nichts scheint in meinem Fall zu helfen. Was mache ich falsch?

+3

Normalerweise würde ich Sie bitten, alle Informationen in der Ausnahme enthalten. Ich glaube jedoch, dass 'configSections' in app.config vor' appSettings' erscheinen muss. –

Antwort

1

Ihr Problem ist, wo Ihre Konfiguration Abschnitt deklariert ist. Das configSections-Tag muss unmittelbar hinter dem Konfigurationsknoten liegen. Versuchen Sie folgendes:

<configuration> 
    <configSections> 
    <section name="clientconfig" type="KeepWarm.ClientConfig" /> 
    </configSections> 
    <appSettings> 
    <add key="MinWaitTime" value="150" /> 
    <add key="MaxWaitTime" value="900" /> 
    </appSettings> 
    <clientconfig username="test user" password="test password"> 
    <urls> 
     <add url="test1" /> 
     <add url="test2" /> 
     <add url="test3" /> 
    </urls> 
    </clientconfig> 
</configuration>