ConfigurationSection ConfigurationManager.GetSection () всегда возвращает ноль - PullRequest
10 голосов
/ 18 мая 2011

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

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

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

        string value = section.Value;
    }
}

Конфигурация приложения:

<?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», он возвращает ноль или выдает ошибку, в которой говорится, что «тест» является нераспознанным элементом. Значения, которые я пробовал:

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

Ответы [ 2 ]

10 голосов
/ 18 мая 2011

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

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

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

  3. Самое главное, как вы объявили свой раздел, система конфигурации будет ожидать, что ваше «значение» будет сохранено в атрибуте вашего элемента 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 . Он также содержит информацию о том, как хранить значения конфигурации в подэлементах (например, в вашем тестовом элементе).

1 голос
/ 15 марта 2016

У меня была похожая проблема с:

ConfigurationManager.GetSection("CompaniesSettings")

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

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

Я получил ошибку:

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

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

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

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

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