Уникайте спадкування web.config у дочірньому веб-додатку, використовуючи nasleditInChildApplications


153

Я намагаюся додати

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

Відповіді:


203

Як згадували коментарі попередньої відповіді, ви не можете просто додати рядок ...

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


11
Чи можна це зробити навпаки? Мені здається дивним, що мені доводиться оновлювати батьків, коли саме дитина вирішує, чи слід успадковувати настройки чи ні.
nabeelfarid

@nabeelfarid - я повністю згоден. Якщо у вас є блог wordpress у програмі .NET із складною web.config, це може бути величезним болем, пов'язаним із його очищенням чи запобіганням спадкування. Я думаю, що вся система "розташування" розроблена більше для безпеки для спільних хостів, що для проблем сумісності більшість людей опиняються тут
Simon_Weaver

Це не працює для мене? Будь-які думки? У мене є служба wcf, у якої батьківський конфігуратор встановлений на підключення до бази даних SIT. У мене є ще одна папка в тій же службі, яка говорить "QA", і вона містить ті самі файли служб WCF, що і в SIT, включаючи web.config, але вказує базу даних на QA. Коли я закликаю службу wcf всередині папки "QA", вона бере з'єднання лише з батьківського конфігурації (навіть я даю тег <location>). Будь ласка, дайте мені знати, в чому проблема.
superachu

@ NickCecil Як я досягти цього в IIS 6? inheritInChildApplicationsне приймається як допустимий параметр для <location />елемента. На моєму веб-сайті працює SharePoint (2007). Я створив додаток у віртуальному каталозі на цьому веб-сайті, яким керує власний пул додатків. Тим не менш, у мене виникають конфлікти між конфігурацією SharePoint і цим додатком. Дивіться це запитання, яке я опублікував у «Серверні помилки».
Веб-користувач

1
Мій додаток, який я створив у дитинстві веб-сайту, все ще хоче завантажити DLL-файли з батьківського веб-сайту. Мабуть, я не можу використовувати <location>для виконання ...
Френсіс Дюшарм

65

Потрібно перейти безпосередньо під кореневий <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>

17
Я отримую цю помилку "Розділ конфігурації" configSections "не можна прочитати, оскільки у ньому відсутній декларація розділу" у файлі моїх батьків web.config.
Бланкмен

Чи можете ви розмістити свій конфігурацію з елементом <location> у ньому? Я також перегляну мою редагування і побачити, чи <clear /> може бути кращим підходом до того, що ви намагаєтесь зробити.
Ендрю Заєць

6
він не працює, якщо помістити його прямо під <configuration>. Ви можете обгортати, скажімо, на вузлі <system.web>, але ви не можете просто поставити його в корінь, як це.
PositiveGuy

Якщо ви помістите його під <configuration> як другий вузол, ви отримаєте "атрибут deditInChildApplications не оголошено". Отже, це не допустимий атрибут на цьому рівні в web.config. То як ти можеш сказати, що це спрацювало?
PositiveGuy

12
-1: Я також можу підтвердити, що використання елемента розташування, як показано вище, НЕ працює.
Адріан Григоре

23

Я все вклав у:

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

У мене є спеціальні розділи
Кікенет

Це вирішило моє питання. У мене був веб-додаток з EF6.1.3 та дитячий веб-додаток із EF5. Оновлення дитячого веб-додатка не підлягало сумніву, тому мені довелося використовувати цю техніку, щоб вона працювала, і вона спрацювала. Я послухав тої наприклад, зміна myNotInheritedSectionsдо ef6Privateі unwantedSectionє entityFrameworkрозділ.
Мохамед Нуур

Чи можете ви допомогти, чому моя не працює, ось мій код <configSections> <sectionGroup name="ef6Private"> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> </sectionGroup> </configSections> <location path="." inheritInChildApplications="false"> <ef6Private> <entityFramework /> </ef6Private> </location>
asteriskdothmg

9

Ми отримали помилку, пов’язану з цим, після недавнього випуску коду в одне з наших середовищ розробки. У нас є додаток, який є дочіркою іншої програми. Ці стосунки працювали чудово протягом РОКІВ до вчора.

Проблема:
Ми отримували помилку сліду жовтого стека через введення дублікатів ключів. Це тому, що і web.config для дочірніх та батьківських програм мав цей ключ. Але це існувало багато років без змін. Чому раптом зараз це питання?

Рішення:
Причина цього ніколи не була проблемою в тому, що значення клавіш І завжди були однаковими. Вчора ми оновили наші рядки підключення SQL, щоб включити Ім'я програми у рядок з'єднання. Це зробило струну унікальною і раптом почала провалюватися.

Не роблячи жодних досліджень щодо точної причини цього, я повинен припустити, що, коли дочірнє додаток успадковує батьки значення web.config, воно ігнорує ідентичні пари ключ / значення.

Нам вдалося вирішити це, обернувши такий рядок з'єднання

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

Редагувати: я забув зазначити, що додав це у веб-сторінку PARENTS. Мені не довелося змінювати дитячу web.config.

Дякуємо за допомогу щодо кожного, врятували наші недопалки.


6

Якщо (як я розумію) ви намагаєтесь повністю заблокувати спадщину у веб-конфігурації вашої дочірньої програми, я пропоную вам уникати використання тегу в 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.

Маттео


1
MSDN каже: "Якщо помилково, усі налаштування файлів Web.config будуть ігноруватися для цього пулу програм", і це просто не схоже на те, що ви думаєте, що це означає. Я хотів би, щоб це була правильна відповідь, але я просто не можу змусити його працювати. Мені це здається майже таким, як це налаштування означає "повністю заборонити локальний web.config для цього додатка"
Simon_Weaver

Отже, в основному програми в цьому пулі програм повинні працювати без файлу web.config? Я розумію, що "ігнорується web.config" - це той, що знаходиться в кореневій папці. Я кілька разів успішно користувався ним. Переконайтеся, що дочірнє додаток не залежить від конфігурацій у кореневій веб.config (спробуйте запустити дочірнє додаток у окремій кореневій папці).
Маттео Сганзетта

1
Ви також можете перевірити метод №2 на цій сторінці, хоча я не перевіряв його iislogs.com/steveschofield/2009/09/20/…
Matteo Sganzetta

моя дитяча заявка насправді є точною копією батьківської програми. Я хочу вміти, щоб /previewлюди могли протестувати нову версію, перш ніж зробити її живою. Всі завжди пропонують <location>виправити це питання, тому я був дуже радий прочитати ваше повідомлення. Однак він скаржиться The entry 'default' has already been added.на додаток конфігурації, пов’язаний із AppFabric, навіть коли я використовуюenableConfigurationOverride="false"
Simon_Weaver

також якщо я встановив enableConfigurationOverride="false"свою кореневу програму, вона повністю вбиває кореневу програму, і вона навіть не буде працювати :-(
Simon_Weaver


1

Ми отримуємо помилки щодо дублювання директив конфігурації в одному з наших додатків. Після розслідування виглядає, що це через це питання .

Коротше кажучи, наш кореневий веб-сайт - ASP.NET 3.5 (що становить 2.0 із доданими конкретними бібліотеками), і у нас є додаткове застосування, це ASP.NET 4.0.

Успадкування web.config призводить до того, що під-додаток ASP.NET 4.0 успадковує файл web.config батьківського додатка ASP.NET 3.5.

Однак глобальний (або "кореневий") web.config програми ASP.NET 4.0, який знаходиться на 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 (щоб він отримав доступ до rootSections кореневого web.config)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.