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"));