10

У меня есть консольное приложение, которое пытается загрузить 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 требуется. Вопрос в том, почему он не выбрасывает это исключение в первый раз?

ответ

3

Я нашел, что лучшим обходным путем для этого было вручную перебрать все вложенные свойства типа ConfigurationElement и проверить их самостоятельно после получения раздела. Если элемент требуется, но нет в файле, я просто бросаю исключение ConfigurationErrorsException.

Вот мой код.

private void ProcessMissingElements(ConfigurationElement element) 
{ 
    foreach (PropertyInformation propertyInformation in element.ElementInformation.Properties) 
    { 
     var complexProperty = propertyInformation.Value as ConfigurationElement; 
     if (complexProperty == null) 
      continue; 

     if (propertyInformation.IsRequired && !complexProperty.ElementInformation.IsPresent) 
      throw new ConfigurationErrorsException("ConfigProperty: [{0}] is required but not present".FormatStr(propertyInformation.Name)); 
     if (!complexProperty.ElementInformation.IsPresent) 
      propertyInformation.Value = null; 
     else 
      ProcessMissingElements(complexProperty); 
    } 
} 
3

Eric has answered this в Форумах MS

Цитирую его ответ:

IsRequired член ConfigurationPropertyAttribute делает не работают применительно к детскому объекта (вытекающих из ConfigurationElement)

+0

Я не думаю, что Эрик правильно ответил на это. Вы можете увидеть мой ответ на него здесь. http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/710c69e7-0c70-4905-8a5d-448c1e12a2e5?prof=required –

+0

Странно, что он работал во второй раз. Было бы интересно отлаживать код .NET framework, чтобы увидеть, что происходит под капотом. -dave –

0

Вы пытались присвоить его правильному типу переменной, то есть MyConfigSection i вместо var? Это единственное различие, которое я вижу между двумя строками кода. (т. е. во второй строке var теперь принимает определенный тип).

+1

Использование определенного типа вместо var не имеет значения –

 Смежные вопросы

  • Нет связанных вопросов^_^