Избегайте наследования web.config в дочерних веб-приложениях с помощью inheritInChildApplications - PullRequest
146 голосов
/ 23 апреля 2009

Я пытаюсь добавить

<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?

Ответы [ 7 ]

194 голосов
/ 11 мая 2011

Как упоминалось в комментариях к предыдущему ответу, вы не можете просто добавить строку ...

<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".

62 голосов
/ 23 апреля 2009

Он должен идти прямо под корневым <configuration> узлом, и вам нужно установить путь следующим образом:

<?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's connection strings -->
    </connectionStrings>
</configuration>
22 голосов
/ 27 июня 2014

Я положил все в:

<location path="." inheritInChildApplications="false">
....
</location>

кроме: <configSections/>, <connectionStrings/> и <runtime/>.

В некоторых случаях мы не хотим наследовать некоторые секции от <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>
8 голосов
/ 11 апреля 2013

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

Проблема:
Мы получили желтую ошибку трассировки стека из-за ввода повторяющихся ключей. Это связано с тем, что ключ web.config для дочернего и родительского приложений имел этот ключ. Но это существовало многие годы без изменений. Почему вдруг это проблема сейчас?

Решение:
Причина, по которой это никогда не было проблемой, заключается в том, что значения ключей И всегда были одинаковыми. Вчера мы обновили строки подключения SQL, чтобы включить Имя приложения в строку подключения. Это сделало строку уникальной, и внезапно начал терпеть неудачу.

Не проводя никаких исследований точной причины этого, я должен предположить, что когда дочернее приложение наследует родительские значения web.config, оно игнорирует идентичные пары ключ / значение.

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

    <location path="." inheritInChildApplications="false">
        <connectionStrings>
            <!-- Updated connection strings go here -->
        </connectionStrings>
    </location>

Редактировать: Я забыл упомянуть, что я добавил это в PARENTS web.config. Мне не нужно было изменять web.config ребенка.

Спасибо за помощь всем, спасли наши задницы.

7 голосов
/ 17 июня 2014

Если (как я понимаю) вы пытаетесь полностью заблокировать наследование в веб-конфигурации вашего дочернего приложения, я предлагаю вам избегать использования тега в web.config. Вместо этого создайте новый пул приложений и отредактируйте файл 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.

Маттео

2 голосов
/ 02 января 2012

Это страница Microsoft на теге location: http://msdn.microsoft.com/en-us/library/b6x6shw7%28v=vs.100%29.aspx

Это может быть полезно для некоторых людей.

1 голос
/ 09 января 2013

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

Короче говоря, наш корневой веб-сайт - 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 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) и работает с дубликатами в узле.

Единственное решение, которое мне удалось найти, - это удалить разделы конфигурации из родительского web.config, а затем либо

  1. Определите, что они вам не нужны в вашем корневом приложении, или если вы делаете
  2. Обновите родительское приложение до ASP.NET 4.0 (чтобы оно получало доступ к корневым файлам config.effig web.config)
...