Непоследовательное поведение ConfigurationManager - PullRequest
0 голосов
/ 21 июня 2019

Я узнал о пользовательских конфигурациях с помощью ConfigurationManager.По какой-то причине вы должны использовать ссылку на сборку в элементе section файла app.config, иначе ConfigurationManager не загрузит app.config.Но в приложении ASP.NET это работает нормально.Почему?

Рассмотрим этот пользовательский класс конфигурации:

namespace CustomConfiguration
{
    class MySection : ConfigurationSection
    {
        [ConfigurationProperty("link", IsKey = true)]
        public string Link
        {
            get => (string) this["link"];
            set => this["link"] = value;
        }
    }
}

Используя этот app.config, я легко могу получить атрибут ссылки myCustomSection в моей программе:

<configuration>
  <configSections>
    <section name="myCustomSection" type="CustomConfiguration.MySection, myAssembly" />
  </configSections>

  ...

  <myCustomSection link="link i can access in my code" >
  </myCustomSection>


</configuration>

Удаление ссылки на сборку в элементе раздела app.config приведет к исключению ConfigurationErrorsException, поскольку ConfigurationManager не может загрузить мой класс CustomConfiguration.MySection в его собственную сборку System.Configuration.Например:

<section name="myCustomSection" type="CustomConfiguration.MySection" />

Но Документация Microsoft говорит, что я должен быть в состоянии сделать это.И на самом деле я могу сделать это в приложении ASP.NET.Отсутствие указания имени сборки в атрибуте типа для раздела все еще работает, и system.configuration волшебным образом выглядит в правильной сборке приложения.Зачем?

1 Ответ

0 голосов
/ 21 июня 2019

Хост-среда ASP.NET имеет другое поведение загрузки сборок;
загружает все ссылочные сборки (с тех пор bin и GAC) в момент запуска.
По этой причине сборкараздела CustomConfiguration.MySection можно разрешить автоматически, не указывая его в определении type.

Если вы включите указанные ниже параметры в файл web.config, ваша сборка myAssembly не будет загружена при начальнойбольше не запускается.
Тогда также потребуется указать сборочную деталь в определении type через CustomConfiguration.MySection, myAssembly.Здесь вы получаете то же поведение, что и в не веб-приложении.

<configuration>
    <!-- ... -->
    <system.web>    
        <compilation>           
          <assemblies>
              <remove assembly="myAssembly" />
          </assemblies>
        </compilation>
    </system.web>
    <!-- ... -->
</configuration>

Справочная документация в вашем вопросе показывает, что раздел (показанный ниже) может быть объявлен в файле app.config (не веб-приложения), но это будет работать только для внешнегопредоставляемые из комплекта конфигурационные классы / обработчики, например, например.System.Configuration.SingleTagSectionHandler, который находится в базовой сборке System (System.dll).
Для всех других (пользовательских) разделов требуется полное имя, полное сборки.

<configuration>
   <configSections>
      <section name="sampleSection"
               type="System.Configuration.SingleTagSectionHandler" />
   </configSections>

   <sampleSection setting1="Value1" 
                  setting2="value two" 
                  setting3="third value" />
</configuration>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...