Избегайте наследования 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.

Маттео

Ответ 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)