IIS express: Невозможно добавить запись дубликата коллекции типа 'add' с уникальным ключевым атрибутом 'name', установленным для
В Visual Studio, Solution- > Web.Project- > Properties- > Web, я изменил свой Url проекта от http://localhost:51123/
до http://localhost:51123/NewProjectName
, и я продолжаю получать эту ошибку:
"Невозможно добавить дублируемую запись коллекции типа 'add' с уникальным ключевым атрибутом 'name' set to...." на каждый добавленный модуль.
Добавление тега remove работает, но тогда это должно было быть проблемой даже до того, как я изменил URL. Любые предложения?
Ответы
Ответ 1
Я думаю, что IIS Express, вероятно, имеет 2 <application>
-blocks, и оба будут указывать на один и тот же физический путь.
Перейдите в конфигурационный файл IIS Express в: My Documents\IISExpress\config\applicationhost.config
Поиск NewProjectName
Измените физический путь для корневого приложения на что-то другое. Укажите это на пустую папку.
Должно выглядеть примерно так:
<site name="NewProjectName" id="1">
<application path="/" applicationPool="Clr4IntegratedAppPool">
<virtualDirectory path="/" physicalPath="c:\Temp" />
</application>
<application path="/NewProjectName" applicationPool="Clr4IntegratedAppPool">
<virtualDirectory path="/" physicalPath="c:\sourcecode\NewProjectName" />
</application>
<bindings>
<binding protocol="http" bindingInformation="*:51123:localhost" />
</bindings>
</site>
Ответ 2
Кроме того, убедитесь, что у вас нет дубликата файла web.config в одной из родительских папок (например: файл резервной копии web.config). Это была проблема с моей!
Ответ 3
Я начал беспорядочно получать эту ошибку. Я заметил, что iis express имеет два сайта. ![введите описание изображения здесь]()
Этот двойной слой заставляет IIS читать web.config с первого сайта и второй в \WFM. поэтому находить дубликаты. Я просто остановил все сайты и удалил \WFM из моего пути к веб-проекту. Однако вы можете очистить файлы и папки от вашего временного файла в IIS express. В моем случае у меня было несколько версий решения, а один проект проекта \user config имел дополнительный путь в URL веб-проекта. VS 2015 добавила его, или кто-то проверил в своей собственной пользовательской конфигурации TFS. Надеюсь, это поможет другим.
Ответ 4
Если вы создаете веб-сайт IIS с физическим путем, аналогичным папке проекта, а затем используйте его, создайте виртуальную папку для проекта, вы увидите эту проблему.
Ваш файл Web.config
загружается дважды.
Вместо этого, как указал orjanto, создайте пустую папку и укажите на нее веб-сайт IIS, а затем используйте ее для создания виртуальной папки из Visual Studio.
Ответ 5
Все файлы web.config
работают с несколькими каскадными уровнями наследования на уровне компьютеров, IIS, проектов и папок, каждый из которых обеспечивает более высокую степень специфичности.
Если вы получаете эту ошибку, значит, вы либо:
- Добавил один и тот же ключ дважды в один и тот же файл (маловероятно, поскольку вы бы его увидели)
- Тот же ключ уже существует в отдельном файле выше цепочки наследования
Для # 2 может быть много разных первопричин, но если вы хотите обойти их стороной, вы можете просто удалить все предыдущие объявления, а затем повторно добавить свои собственные на этом уровне (я бы заплатил хорошие деньги за функцию upsert).
Так что просто добавьте теги <remove>
как это для любых оскорбительных элементов
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<remove name="ErrorLog" />
<remove name="ErrorMail" />
<remove name="ErrorFilter" />
<add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" preCondition="managedHandler" />
<add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" preCondition="managedHandler" />
<add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" preCondition="managedHandler" />
</modules>
</system.webServer>
Ответ 6
Мой проект Url на вкладке Web внутри свойств проекта указал на неправильный URL-адрес, и я не смог его изменить ( "Хотелось бы создать Virtual Directory?", а VS был заблокирован в цикле (Да → Не удалось создать, No → Operation Canceled), пока я вручную не вернул Url в (некорректное) состояние, которое было раньше. Решение заключалось в том, чтобы запустить VS в качестве администратора. Я смог изменить этот URL-адрес, и все начало работать. Надеюсь, это поможет!
Ответ 7
Вы можете обнаружить, что после обновления до последнего пакета обновления Windows 10 июня 2017 года эта проблема возникает из-за того, что определенные узлы теперь отображаются под корневой конфигурацией (machine.config). Я удалил свои дубликаты из web.config, и все это снова работало.
Ответ 8
У меня была проблема одного типа. Запуск моего сайта, опубликованного в IIS, показала ту же ошибку.
Я видел файл web.config
в папке wwwroot
(вне папки приложения).
Я удалил этот файл, и приложение прошло нормально.
Найдите файл web.config
, расположенный в неправильной папке (над приложением папки).
Удачи!
Ответ 9
Ответ, который разместил @orjanto, решил проблему для меня, но у меня была еще одна проблема. После исправления Internet Explorer все еще думал, что моя HTML-страница была каталогом, а не файлом.
У меня были дубликаты в моем конфигурационном файле IIS Express:
<site name="MyAPI" id="56">
<application path="/" applicationPool="Clr4IntegratedAppPool">
<virtualDirectory path="/" physicalPath="C:\source\repos\MyAPI" />
</application>
<application path="/login.html" applicationPool="Clr4IntegratedAppPool">
<virtualDirectory path="/" physicalPath="C:\source\repos\MyAPI" />
</application>
<bindings>
<binding protocol="http" bindingInformation="*:57018:localhost" />
<binding protocol="https" bindingInformation="*:44302:localhost" />
</bindings>
</site>
Обратите внимание на путь = "/login.html" во второй записи <application>.
Моя страница перенаправлялась на "localhost: 57018/login.html/", как будто это был каталог.
Удаление второй записи устранило проблему с дубликатами файла конфигурации, однако у меня продолжала возникать проблема, когда Internet Explorer, казалось, думал, что /login.html/является каталогом (Internet Explorer 11). Для диагностики проблемы я проверил Chrome, и Chrome работал нормально.
Я зашел в Internet Explorer, открыл Сервис> Свойства обозревателя> Вкладка "Общие". Затем в разделе "История просмотров" я удалил историю, файлы cookie и данные веб-сайта, & Temp. Интернет файлы.
Ответ 10
У меня такая же проблема. Оказалось, что у меня был другой проект, который использует IISExpress с тем же номером порта. Как только я изменил проект, чтобы использовать другой номер порта, ошибка исчезла.
Ответ 11
У меня была такая же проблема, вот что я сделал:
- Я изменил настройки сервера с локального IIS на IIS Express:
![enter image description here]()
- Если он по-прежнему не работает, я изменил номер порта на другой, затем нажмите кнопку "Создать виртуальный каталог". Очистите решение, затем восстановите.
![enter image description here]()
Ответ 12
Пока первый ответ действительно решил аналогичную проблему с моей стороны. Я также нашел альтернативное решение, при котором нет необходимости указывать первому веб-сайту пустую папку c:\temp
. Я проверил этот альтернативный подход с моей стороны, и он работал отлично.
Вместо этого посмотрите на вторую запись пути приложения и найдите ее путь, измените path=/
на path=/localhost_portNumber
; поэтому, если в информации о привязке упоминается порт 51123, используйте path=/localhost_51123
во второй конфигурации приложения.
Почему это простое изменение работает, мне не известно, но я посмотрел на файлы applicationHost.config работающих веб-сайтов в VS 2017, чтобы найти это решение.
Альтернативная разметка, которая работает для IIS Express (посмотрите путь второго virtualDirectory)
<site name="NewProjectName" id="1">
<application path="/" applicationPool="Clr4IntegratedAppPool">
<virtualDirectory path="/" physicalPath="c:\sourcecode\NewProjectName" />
</application>
<application path="/localhost_51123" applicationPool="Clr4IntegratedAppPool">
<virtualDirectory path="/" physicalPath="c:\sourcecode\NewProjectName" />
</application>
<bindings>
<binding protocol="http" bindingInformation="*:51123:localhost" />
</bindings>
</site>
Ответ 13
Просто измените номер порта, который еще не используется другим приложением, и он работает