У меня есть консольное приложение, которое пытается загрузить CustomConfigurationSection из файла web.config.Загрузка ConfigurationSection с требуемым дочерним элементом ConfigurationElement с картой конфигурации .Net
В разделе пользовательской конфигурации имеется настраиваемый элемент конфигурации. Это означает, что когда я загружаю раздел конфигурации, я ожидаю увидеть исключение, если этот конфигурационный элемент отсутствует в конфиге. Проблема в том, что инфраструктура .NET, похоже, полностью игнорирует атрибут isRequired. Поэтому, когда я загружаю раздел конфигурации, я просто создаю экземпляр настраиваемого элемента конфигурации и устанавливает его в разделе конфигурации.
Мой вопрос: почему это происходит? Я хочу, чтобы метод GetSection() запускал исключение ConfigurationErrors, поскольку в конфигурации отсутствует необходимый элемент.
Вот как выглядит моя конфигурация.
public class MyConfigSection : ConfigurationSection
{
[ConfigurationProperty("MyConfigElement", IsRequired = true)]
public MyConfigElement MyElement
{
get { return (MyConfigElement) this["MyConfigElement"]; }
}
}
public class MyConfigElement : ConfigurationElement
{
[ConfigurationProperty("MyAttribute", IsRequired = true)]
public string MyAttribute
{
get { return this["MyAttribute"].ToString(); }
}
}
Вот как я загружаю раздел конфигурации.
class Program
{
public static Configuration OpenConfigFile(string configPath)
{
var configFile = new FileInfo(configPath);
var vdm = new VirtualDirectoryMapping(configFile.DirectoryName, true, configFile.Name);
var wcfm = new WebConfigurationFileMap();
wcfm.VirtualDirectories.Add("/", vdm);
return WebConfigurationManager.OpenMappedWebConfiguration(wcfm, "/");
}
static void Main(string[] args)
{
try{
string path = @"C:\Users\vrybak\Desktop\Web.config";
var configManager = OpenConfigFile(path);
var configSection = configManager.GetSection("MyConfigSection") as MyConfigSection;
MyConfigElement elem = configSection.MyElement;
} catch (ConfigurationErrorsException ex){
Console.WriteLine(ex.ToString());
}
}
Вот как выглядит мой конфигурационный файл.
<?xml version="1.0"?>
<configuration>
<configSections>
<section name="MyConfigSection" type="configurationFrameworkTestHarness.MyConfigSection, configurationFrameworkTestHarness" />
</configSections>
<MyConfigSection>
</MyConfigSection>
часть странно, что если открыть конфигурационный файл и загрузить секция 2 раза подряд, я получаю исключение, что я ожидал.
var configManager = OpenConfigFile(path);
var configSection = configManager.GetSection("MyConfigSection") as MyConfigSection;
configManager = OpenConfigFile(path);
configSection = configManager.GetSection("MyConfigSection") as MyConfigSection;
Если я использую код, приведенный выше, то исключение будет срабатывать и скажите мне, что MyConfigElement требуется. Вопрос в том, почему он не выбрасывает это исключение в первый раз?
Я не думаю, что Эрик правильно ответил на это. Вы можете увидеть мой ответ на него здесь. http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/710c69e7-0c70-4905-8a5d-448c1e12a2e5?prof=required –
Странно, что он работал во второй раз. Было бы интересно отлаживать код .NET framework, чтобы увидеть, что происходит под капотом. -dave –