Вложенное ASP.NET «приложение» в IIS наследует родительские значения конфигурации? - PullRequest
29 голосов
/ 10 ноября 2010

В настоящее время у меня есть 2 x веб-приложения ASP.NET 3.5 в IIS7 (давайте назовем их WebParent и WebChild).

WebChild вложен в список WebParent в IIS7 и настроен как приложение (а не просто виртуальный каталог в WebParent). Оба в настоящее время используют свой собственный (классический) пул приложений.

И WebParent, и WebChild имеют свои собственные полностью определенные файлы web.config в своих собственных корневых каталогах.

Я предполагал, что, поскольку WebChild определяется как «Приложение» в IIS, он не будет наследовать ничего из файла конфигурации WebParent. Однако, несмотря на эту конфигурацию, я вижу ошибки, связанные с различными элементами в файле web.config, которые уже определены (это правильно, есть пара элементов, которые находятся в обоих файлах конфигурации, но я думал, что они должны рассматриваться полностью независимо от другой)

Может кто-нибудь объяснить, почему это может происходить?

Ответы [ 4 ]

61 голосов
/ 10 ноября 2010

Точное решение вашей проблемы будет зависеть от того, какое сообщение об ошибке конфигурации вы видите. Однако это типичная проблема, которую часто можно решить с помощью атрибута inheritInChildApplications элемента location в web.config для «WebParent». Обернув весь раздел system.web в элемент location следующим образом, вы сможете устранить описанную проблему:

<location path="." inheritInChildApplications="false">
  <system.web>
    <!-- ... -->
  </system.web>
</location>

В IIS 7 вы также захотите обернуть системный раздел.WebServer таким же образом:

<location path="." inheritInChildApplications="false"> 
  <system.webServer>
    <!-- ... -->
  </system.webServer>
</location>

Это решение основано на отличной статье в блоге, которую я нашел здесь .

15 голосов
/ 10 ноября 2010

Если они повторяются, вам нужно будет <remove/>, затем сначала в дочернем приложении web.config, а затем добавить обратно элемент, который вам нужен, и поместить его.Это предполагает, что вы хотели бы иметь другое значение.Если нет, просто опустите элемент.Строка подключения была бы хорошим примером чего-то, что, вероятно, является общим для всех приложений - поэтому вам нужно только указать это в корне.

Пример:

    <siteMap defaultProvider="AdminSiteMapProvider" enabled="true">
      <providers>
        <remove name="AdminSiteMapProvider"/>
        <add name="AdminSiteMapProvider" description="Admin SiteMap provider" type="System.Web.XmlSiteMapProvider" siteMapFile="~/App_Data/admin.sitemap" securityTrimmingEnabled="true" />
      </providers>
    </siteMap>
3 голосов
/ 15 октября 2014

Я думаю, что inheritInChildApplications = "false" подходит для случаев, когда вы все еще хотите унаследовать некоторую часть конфигурации от родителя.В тех случаях, когда вы хотите полностью прекратить наследование (как в этом случае, если я прав), я бы предложил использовать 2 отдельных пула приложений для 2 приложений, а затем применить не очень хорошо документированный параметр в файле applicationHost.config.как я объяснил в этом вопросе «Запись уже добавлена» - два отдельных пула приложений

<add name="MyAppPool" autoStart="true" managedRuntimeVersion="v4.0" managedPipelineMode="Integrated" enableConfigurationOverride="false">
    <processModel identityType="NetworkService" />
</add>
0 голосов
/ 10 ноября 2010

Следуйте советам Скотта, а также убедитесь, что вы щелкнули правой кнопкой мыши WebChild в IIS и выбрали Преобразовать в приложение.

...