Search code examples
c#configurationmanager

System.Configuration.ConfigurationErrorsException - Unrecognized element 'setting'


Unrecognized element 'setting'. (C:\Dev\DOT.NET\AutoPay\ibeam.config line 15)

AppInfo.Sections.Get("AutoPay.Common.Credentials") 'AppInfo.Sections.Get("AutoPay.Common.Credentials")' threw an exception of type 'System.Configuration.ConfigurationErrorsException' System.Configuration.ConfigurationSection {System.Configuration.ConfigurationErrorsException}

My config file:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
<sectionGroup name="AppInfo" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
  <section name="AutoPay.Common.Credentials" 
           type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
               allowExeDefinition="MachineToLocalUser" 
               requirePermission="false" />
    </sectionGroup>
  </configSections>

  <AppInfo>
    <AutoPay.Common.Credentials>
      <setting name="UserName" serializeAs="String"><value>********</value></setting>
      <setting name="Password" serializeAs="String"><value>********</value></setting>
      <setting name="ServiceUrl" serializeAs="String"><value>********</value></setting>
    </AutoPay.Common.Credentials>
  </AppInfo>
</configuration>

Base (abstract) class:

public abstract class BaseConfigInfo : ConfigurationSectionGroup
{
    protected Configuration Configuration;
    protected ConfigurationSectionGroup AppInfo;
    protected ClientSettingsSection Credentials;

    protected BaseConfigInfo(string configFile)
    {
        var fileMap = new ConfigurationFileMap(configFile);
        Configuration = ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
        AppInfo = Configuration.GetSectionGroup("AppInfo");

        // THIS IS WHERE THE ERROR POPS //
        Credentials = (ClientSettingsSection)AppInfo.Sections.Get("AutoPay.Common.Credentials");
    }

    protected string GetCredentialsString(string kvpName)
    {
        var setting = Credentials.Settings.Get(kvpName);
        return setting.Value.ValueXml.InnerText;
    }

    public string UserName { get { return GetCredentialsString("UserName"); } }
    public string Password { get { return GetCredentialsString("Password"); } }
    public string ServiceUrl { get { return GetCredentialsString("ServiceUrl"); } }
}

Sample concrete class:

public class ConfigInfoIbeam : BaseConfigInfo
{
    public ConfigInfoIbeam() : base(ConfigurationManager.AppSettings["ConfigInfoIbeam"]) { }
}

I know I am missing something simple here. I'm running in .NET 4. Nothing too usefull showing up when I try to google for this error. Any ideas?


Solution

  • I found the problem. In my config I had this:

      <AppInfo>
        <AutoPay.Common.Credentials>
          <setting name="UserName" serializeAs="String"><value>********</value></setting>
          <setting name="Password" serializeAs="String"><value>********</value></setting>
          <setting name="ServiceUrl" serializeAs="String"><value>********</value></setting>
        </AutoPay.Common.Credentials>
      </AppInfo>
    

    I changed it to:

      <AppInfo>
        <AutoPay.Common.Credentials>
          <setting name="UserName" serializeAs="String">
            <value>********</value>
          </setting>
          <setting name="Password" serializeAs="String">
            <value>********</value>
          </setting>
          <setting name="ServiceUrl" serializeAs="String">
            <value>********</value>
          </setting>
        </AutoPay.Common.Credentials>
      </AppInfo>
    

    Don't ask me why the underlying xml reader cannot differentiate between the two. However, problem solved! grrrr...