Попытка открыть раздел из web.config вызывает исключение ConfigurationErrorsException: запись KEY уже добавлена

Я пытаюсь получить некоторые настройки от моего поставщика членства в моем приложении asp.net (чтобы мне не нужно было дублировать информацию в разделе appSettings), но я получаю следующее исключение:

System.Configuration.ConfigurationErrorsException: The entry 'MyMembershipProvider' has already been added. (C:\Inetpub\intranet-webapp\web.config line 53)

Мой код следующий:

var configurationManager = WebConfigurationManager.OpenWebConfiguration("/", "IntranetWebapp");
var section = (MembershipSection) configurationManager.GetSection("system.web/membership");

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

Содержимое моего раздела конфигурации:

<membership defaultProvider="IntranetApp">
  <providers>
    <add applicationName="IntranetApp"
         enableSearchMethods="true"
         connectionStringName="IntranetConnectionString"
         connectionUsername="CN=username,OU=Service Accounts,OU=Users,OU=CompanyName,DC=CompanyName,DC=com"
         connectionPassword="********"
         name="MyIntranetMembershipProvider"
         type="System.Web.Security.ActiveDirectoryMembershipProvider" />
  </providers>
</membership>

Любая помощь очень ценится.

Пабло


person Pablo    schedule 27.08.2009    source источник
comment
Не могли бы вы опубликовать содержимое рассматриваемого раздела Config? Анонимно, если хотите ;)   -  person Zhaph - Ben Duguid    schedule 27.08.2009
comment
@Zhaph Не знаю, полезно ли это, но вот...   -  person Pablo    schedule 27.08.2009
comment
Разве вторая строка не должна выглядеть следующим образом: var section = (MembershipSection) configurationManager.GetSection(system.web/membership);?   -  person Zhaph - Ben Duguid    schedule 27.08.2009


Ответы (3)


Предполагая исправление из моего комментария, я не вижу ничего плохого в вашем коде - использование того же самого (очевидно, с другим значением для свойства сайта) приводит к заполненной переменной раздела, как я и ожидал.

Единственное, о чем я могу думать, это то, что вы либо делаете что-то еще с ConfigurationFile.Getsection, то есть пытаетесь объединить данные с вашим основным параметром, либо используете перегрузку OpenWebConfiguration, которая берет сайт, который вам удалось открыть web.config из другой области иерархии на ваш сайт — есть ли у вас несколько приложений, определенных в IIS/.NET, которые могут иметь конфликтующие значения для их параметра членства?

Наконец, не должно ли значение DefaultProvider читать «MyIntranetMembershipProvider», которое является именем вашего провайдера, а не «IntranetApp», которое является именем приложения (в хранилище данных провайдера).

person Zhaph - Ben Duguid    schedule 27.08.2009
comment
Извините, это была опечатка, когда я анонимизировал свой xml-код. Декларация провайдера верна. Мне кажется, что целью метода GetSection является не загрузка содержимого файла конфигурации, а его изменение. - person Pablo; 28.08.2009
comment
Ну, это для чтения и записи в файл конфигурации, поэтому он должен работать - также правильно ли ваша строка для GetSection (согласно моему второму комментарию). Какие аспекты поставщика вы пытаетесь избежать дублирования в AppSettings? - person Zhaph - Ben Duguid; 28.08.2009

Мне удалось решить эту проблему, выполнив действия CzechDeveloper в связанном потоке с :

<clear />

Важно: Это сработало только для меня, когда я поместил его прямо над вложенным элементом, который дублировался.

<sso>
  <stores>
    <clear />
    <store name="Store1" apiKey="abcd" />
    <store name="Store2" apiKey="efgh" />
  </stores>
</sso>

Мы также начали сталкиваться с этими проблемами, когда начали добавлять виртуальные каталоги как therealsix указывает.

person cat5dev    schedule 08.04.2015

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

Я смог обойти это, добавив это прямо перед рассматриваемой строкой:

<remove name="MyMembershipProvider"/>
person therealsix    schedule 27.08.2009
comment
Да, WebConfigurationManager работает следующим образом: он объединяет каждый из файлов web.config в структуру папок, откуда вы его вызвали, создает резервную копию в корне приложения, а затем в различных файлах web.config и machine.config. в папке конфигурации фреймворка. - person Zhaph - Ben Duguid; 27.08.2009