ConfigurationSection ConfigurationManager.GetSection() всегда возвращает null

Я пытаюсь узнать, как использовать класс ConfigurationSection. Я использовал IConfigurationSectionHandler, но выпустил, что он был обесценен. Поэтому, будучи хорошим парнем, я стараюсь "правильно". Моя проблема в том, что он всегда возвращает null.

У меня есть консольное приложение и DLL.

class Program
{
    static void Main(string[] args)
    {           
        StandardConfigSectionHandler section = StandardConfigSectionHandler.GetConfiguration();

        string value = section.Value;
    }
}

app config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  <configSections>
    <sectionGroup name="ConfigSectionGroup">
      <section name="ConfigSection" type="Controller.StandardConfigSectionHandler, Controller" />
    </sectionGroup>
  </configSections>

  <ConfigSectionGroup>
    <ConfigSection>
      <test value="1" />
    </ConfigSection>
  </ConfigSectionGroup>

</configuration>

в DLL:

namespace Controller
{    
    public class StandardConfigSectionHandler : ConfigurationSection
    {
    private const string ConfigPath = "ConfigSectionGroup/ConfigSection/";

    public static StandardConfigSectionHandler GetConfiguration()
    {
        object section = ConfigurationManager.GetSection(ConfigPath);
        return section as StandardWcfConfigSectionHandler;
    }

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

Какие бы значения я ни выбрал для "ConfigPath", он вернет null или выкинет ошибку, говоря "тест" является непризнанным элементом. Значения, которые я пробовал:

  • ConfigSectionGroup
  • ConfigSectionGroup/
  • ConfigSectionGroup/ConfigSection
  • ConfigSectionGroup/ConfigSection/
  • ConfigSectionGroup/ConfigSection/тест
  • ConfigSectionGroup/ConfigSection/тест/

Ответ 1

В коде есть пара ошибок.

  • Вы всегда возвращаете null в свой метод GetConfiguration, но я собираюсь предположить это как раз в вопросе, а не в вашем фактическом коде.

  • Что еще более важно, формат значения ConfigPath неверен. У вас есть конечная черта ConfigSectionGroup/ConfigSection/, удалите последнюю косую черту, и она сможет найти раздел.

  • Самое главное, то, как вы объявили свой раздел, система конфигурации ожидает, что ваше "значение" будет сохранено в атрибуте вашего элемента ConfigSection. Как этот

    <ConfigSectionGroup>
      <ConfigSection value="foo" />
    </ConfigSectionGroup>
    

Итак, все вместе:

public class StandardConfigSectionHandler : ConfigurationSection
{
    private const string ConfigPath = "ConfigSectionGroup/ConfigSection";

    public static StandardConfigSectionHandler GetConfiguration()
    {
        return (StandardConfigSectionHandler)ConfigurationManager.GetSection(ConfigPath);
    }

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

Чтобы узнать больше о настройке разделов конфигурации, обратитесь к этой замечательной документации MSDN: Как создать собственные разделы конфигурации с помощью ConfigurationSection. Он также содержит информацию о том, как сохранять значения конфигурации в подэлементах (например, ваш тестовый элемент).

Ответ 2

Я был похож на проблему с:

ConfigurationManager.GetSection("CompaniesSettings")

Мой конфигурационный файл:

    <section name="CompaniesSettings" type="Swedbank2015.CompaniesSectionReader, Swedbank2015"/>

Появилась ошибка:

Не удалось загрузить файл или сборку "Swedbank2015"

Я нашел интересное решение, я переместил файл класса в отдельный проект (type = Class Library, name = SwBankConfigHelper). Я добавил его в ссылку и изменил конфигурационный файл:

<section name="CompaniesSettings" type=" SwBankConfigHelper.CompaniesSectionReader, SwBankConfigHelper"/>

И мой код работает отлично!

CompaniesConfig = new CompaniesConfig((XmlNodeList)ConfigurationManager.GetSection("CompaniesSettings"));