ConfigurationErrorsException "Invalid Key Value", What am I doing wrong?

.net, app-config, c#

Solution

I've not seen custom sections defined the way you are trying to do. You can however get it to work by making a few minor changes

Change your config from:

...
<MySection>
    <add name="MyName" value="MyValue" />
</MySection>
...

to:

...
<MySection>
    <MyElements>
        <add name="MyName" value="MyValue" />
    </MyElements>
</MySection>
...

and then modify your code slightly:

public class MySection : ConfigurationSection
{
    [ConfigurationProperty("MyElements", IsDefaultCollection = true)]
    public MyCollection Collection{get {return (MyCollection) this["MyElements"];}}
}

public class MyElement : ConfigurationElement
{
    [ConfigurationProperty("name")]
    public string Name
    {
        get {return (string) (base["name"]);}
        set {base["name"] = value;}
    }

    [ConfigurationProperty("value")]
    public string Value
    {
        get {return (string) (base["value"]);}
        set {base["value"] = value;}
    }
}

(the `MyCollection` class remains unchanged)

This will then work, and will also enable you to add multiple values in your config:

...
<MySection>
    <MyElements>
        <add name="MyName1" value="MyValu1e" />
        <add name="MyName2" value="MyValue2" />
    </MyElements>
</MySection>
...

Problem

I have a simple console application that is designed to read a custom Configuration Exception (code below) when I run this I am getting a ConfigurationErrorsException with the message "Invalid Key Value" when calling ConfigurationManager.GetSection. Can anyone see what I have done wrong? Config File ``` <?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="MySection" type="ConsoleApplication1.MySection, ConsoleApplication1" /> </configSections> <MySection> <add name="MyName" value="MyValue" /> </MySection> </configuration> ``` Code ``` using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml.Serialization; using System.Configuration; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { MySection section = (MySection)ConfigurationManager.GetSection("MySection"); Console.WriteLine("Done"); } } public class MySection : ConfigurationSection { [ConfigurationProperty("", IsDefaultCollection = true)] public MyCollection Collection { get { return (MyCollection)this[""]; } } } public class MyCollection : ConfigurationElementCollection { protected override ConfigurationElement CreateNewElement() { return new MyElement(); } protected override object GetElementKey(ConfigurationElement element) { return ((MyElement)element).Name; } } public class MyElement : ConfigurationElement { [ConfigurationProperty("name")] public string Name { get; set; } [ConfigurationProperty("value")] public string Value { get; set; } } } ``` Exception ``` System.Configuration.ConfigurationErrorsException was unhandled Message=Invalid key value. (C:\Users\martin.brown\documents\visual studio 2010\Projects\ConsoleApplication1\bin\Debug\ConsoleApplication1.vshost.exe.config line 7) Source=System.Configuration BareMessage=Invalid key value. Filename=C:\Users\martin.brown\documents\visual studio 2010\Projects\ConsoleApplication1\bin\Debug\ConsoleApplication1.vshost.exe.config Line=7 StackTrace: at System.Configuration.BaseConfigurationRecord.EvaluateOne(String[] keys, SectionInput input, Boolean isTrusted, FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentResult) at System.Configuration.BaseConfigurationRecord.Evaluate(FactoryRecord factoryRecord, SectionRecord sectionRecord, Object parentResult, Boolean getLkg, Boolean getRuntimeObject, Object& result, Object& resultRuntimeObject) at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object& result, Object& resultRuntimeObject) at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object& result, Object& resultRuntimeObject) at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object& result, Object& resultRuntimeObject) at System.Configuration.BaseConfigurationRecord.GetSection(String configKey) at System.Configuration.ClientConfigurationSystem.System.Configuration.Internal.IInternalConfigSystem.GetSection(String sectionName) at System.Configuration.ConfigurationManager.GetSection(String sectionName) at ConsoleApplication1.Program.Main(String[] args) in C:\Users\martin.brown\documents\visual studio 2010\Projects\ConsoleApplication1\Program.cs:line 14 at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() at System.Threading.ThreadHelper.ThreadStart_Context(Object state) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart() InnerException: ```

Original source