Избегайте наследования web.config в дочернем веб-приложении с использованием inheritInChildApplications
Я пытаюсь добавить
<location inheritInChildApplications="false">
для моего родительского веб-приложения web.config, но он, похоже, не работает.
У моего родителя web.config
есть:
<configuration>
<configSections>
</configSections>
// 10 or so custom config sections like log4net, hibernate,
<connectionStrings>
</connectionStrings>
<appSettings>
</appSettings>
<system.diagnostics>
</system.diagnostics>
<system.web>
<webParts>
</webParts>
<membership>
</membership>
<compilation>
</compilation>
</system.web>
<location ..>
<system.web>
</system.web>
</location>
<system.webServer>
</system.webServer>
Мое дочернее веб-приложение настроено как приложение в IIS и наследуется от родительского web.config
, вызывающего проблемы.
Где именно следует разместить
<location inheritInChildApplications="false">
чтобы игнорировать все настройки web.config?
Ответы
Ответ 1
Как отмечали комментаторы предыдущего ответа, вы не можете просто добавить строку...
<location path="." inheritInChildApplications="false">
... чуть ниже <configuration>
. Вместо этого вам нужно обернуть отдельные разделы web.config, для которых вы хотите отключить наследование. Например:
<!-- disable inheritance for the connectionStrings section -->
<location path="." inheritInChildApplications="false">
<connectionStrings>
</connectionStrings>
</location>
<!-- leave inheritance enabled for appSettings -->
<appSettings>
</appSettings>
<!-- disable inheritance for the system.web section -->
<location path="." inheritInChildApplications="false">
<system.web>
<webParts>
</webParts>
<membership>
</membership>
<compilation>
</compilation>
</system.web>
</location>
Хотя <clear />
может работать для некоторых разделов конфигурации, есть некоторые, для которых вместо этого требуется директива <remove name="...">
, а остальные, похоже, тоже не поддерживают. В таких ситуациях, вероятно, необходимо установить inheritInChildApplications="false"
.
Ответ 2
Он должен идти прямо под корнем <configuration>
node, и вам нужно установить такой путь:
<?xml version="1.0"?>
<configuration>
<location path="." inheritInChildApplications="false">
<!-- Stuff that shouldn't be inherited goes in here -->
</location>
</configuration>
Лучшим способом обработки наследования конфигурации является использование <clear/>
в дочерней конфигурации везде, где вы не хотите наследовать. Поэтому, если вы не хотели наследовать родительские строки подключения к конфигурации, вы бы сделали что-то вроде этого:
<?xml version="1.0"?>
<configuration>
<connectionStrings>
<clear/>
<!-- Child config connection strings -->
</connectionStrings>
</configuration>
Ответ 3
Я все вложил:
<location path="." inheritInChildApplications="false">
....
</location>
кроме: <configSections/>
, <connectionStrings/>
и <runtime/>
.
Есть случаи, когда мы не хотим наследовать некоторые secions из <configSections />
, но мы не можем поместить тег <section/>
в <location/>
, поэтому нам нужно создать <secionGroup />
и поместить наши нежелательные разделов в эту группу. Группы разделов впоследствии могут быть вставлены в тег местоположения.
Итак, мы должны изменить это:
<configSections>
<section name="unwantedSection" />
</configSections>
В:
<configSections>
<sectionGroup name="myNotInheritedSections">
<section name="unwantedSection" />
</sectionGroup>
</configSections>
<location path="." inheritInChildApplications="false">
<myNotInheritedSections>
<unwantedSection />
</myNotInheritedSections>
</location>
Ответ 4
Мы получили ошибку, связанную с этим, после недавнего выпуска кода в одну из наших сред разработки. У нас есть приложение, которое является дочерним элементом другого приложения. Эти отношения работали нормально для ЛЕТ до вчерашнего дня.
Проблема:
Мы получили желтую ошибку трассировки стека из-за ввода повторяющихся ключей. Это связано с тем, что этот ключ используется как для web.config для дочерних, так и для родительских приложений. Но это существовало уже много лет без изменений. Почему все это внезапно стало проблемой?
Решение:
Причина, по которой это никогда не было проблемой, состоит в том, что ключи и значения всегда были одинаковыми. Вчера мы обновили наши строки SQL-соединений, чтобы включить имя приложения в строку подключения. Это сделало строку уникальной, и все внезапно начали сбой.
Не делая каких-либо исследований по конкретной причине этого, я должен предположить, что когда дочернее приложение наследует родительские значения web.config, оно игнорирует одинаковые пары ключ/значение.
Мы смогли решить эту проблему, обернув строку подключения следующим образом
<location path="." inheritInChildApplications="false">
<connectionStrings>
<!-- Updated connection strings go here -->
</connectionStrings>
</location>
Изменить: Я забыл упомянуть, что добавил это в файл PARENTS web.config. Мне не нужно было изменять дочерний файл web.config.
Спасибо всем за помощь в этом, спасли наши приклады.
Ответ 5
Если (как я понимаю) вы пытаетесь полностью заблокировать наследование в веб-конфигурации вашего дочернего приложения, я предлагаю вам избегать использования тега в web.config.
Вместо этого создайте новый apppool и отредактируйте файл applicationHost.config(расположенный в% WINDIR%\System32\inetsrv\Config и% WINDIR%\SysWOW64\inetsrv\config).
Вам просто нужно найти запись для своего приложения и добавить атрибут enableConfigurationOverride="false"
, как в следующем примере:
<add name="MyAppPool" autoStart="true" managedRuntimeVersion="v4.0" managedPipelineMode="Integrated" enableConfigurationOverride="false">
<processModel identityType="NetworkService" />
</add>
Это позволит избежать наследования конфигурации в приложениях, обслуживаемых MyAppPool.
Маттео
Ответ 6
Это страница microsoft в теге location
: http://msdn.microsoft.com/en-us/library/b6x6shw7%28v=vs.100%29.aspx
Это может быть полезно некоторым людям.
Ответ 7
Мы получаем ошибки относительно дублирующих конфигурационных директив в одном из наших приложений.
После исследования это выглядит так из-за этой проблемы.
Вкратце, наш корневой сайт - это ASP.NET 3.5 (это 2.0 с добавленными конкретными библиотеками), и у нас есть вспомогательное приложение, которое представляет собой ASP.NET 4.0.
Наследование web.config заставляет суб-приложение ASP.NET 4.0 наследовать файл web.config родительского приложения ASP.NET 3.5.
Тем не менее, приложение ASP.NET 4.0, глобальное (или "root" ) web.config, которое находится в C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\web.config и C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config(в зависимости от вашей битности) уже содержит эти разделы конфигурации.
Затем приложение ASP.NET 4.0 пытается объединить корневой ASP.NET 4.0 web.config и родительский web.config(тот, который используется для приложения ASP.NET 3.5), и работает с дубликатами в node.
Единственное решение, которое я смог найти, - удалить разделы конфигурации из родительского web.config, а затем либо
- Определите, что они вам не нужны в корневом приложении, или если вы делаете
- Обновите родительское приложение до ASP.NET 4.0 (чтобы он получал доступ к корневым конфигурациям web.config)