避免使用InheritInChildApplications在子Web应用程序中继承web.config


153

我正在尝试添加

<location inheritInChildApplications="false">

到我的父Web应用程序的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>

我的子级Web应用程序被设置为IIS中的应用程序,并且是从父级Web应用程序继承而来的web.config,这会引起问题。

我到底应该放在哪里

<location inheritInChildApplications="false">

因此它会忽略所有各种web.config设置?

Answers:


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-我完全同意。如果您在带有复杂web.config的.NET应用程序中有一个wordpress博客,则在清除它或阻止继承方面可能会非常痛苦。我认为整个“位置”系统的设计重点是针对共享主机的安全性,这是大多数人在这里发现的兼容性问题的
原因-Simon_Weaver

这对我不起作用吗?有什么想法吗?我有一个wcf服务,其父配置设置为SIT数据库连接。我在同一服务中有另一个文件夹,其内容为“ QA”,其中包含与SIT中相同的WCF服务文件,包括web.config,但将数据库指向QA。当我在“ QA”文件夹中调用wcf服务时,它仅从父配置获取连接(即使我提供了<location>标记)。请让我知道会有什么问题。
superachu 2014年

@NickCecil如何在IIS 6中实现呢?inheritInChildApplications不被接受为<location />元素的有效参数。我的网站正在运行SharePoint(2007)。我在此网站下的虚拟目录中创建了一个应用程序,由其自己的应用程序池管理。但是,我在SharePoint的配置和此应用程序之间遇到冲突。请参阅我在“服务器故障”中发布的此问题
网络用户

1
我作为网站的子级创建的应用程序仍然希望从父级网站加载DLL。显然,我不能<location>用于运行时...
Francis Ducharme

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
我在我的父母web.config文件中收到此错误“无法读取配置节'configSections',因为它缺少节声明”。
Blankman

您可以在其中发布带有<location>元素的配置吗?我还将检查我的编辑,看看<clear />是否可能是您尝试做的更好的方法。
Andrew Hare

6
当您将其放在<configuration>下时,它不起作用。您可以包装<system.web>节点,但不能仅将其放在根目录中。
PositiveGuy

如果将其放在<configuration>下作为第二个节点,则会得到“未声明inheritInChildApplications属性”。因此,它不是web.config中该级别的有效属性。那么,您如何说这行得通呢?
PositiveGuy

12
-1:我还可以确认使用上面显示的location元素不起作用。
阿德里安·格里戈里

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>

我有自定义部分
Kiquenet '16

这解决了我的问题。我有一个带有EF6.1.3的Web应用程序,一个带有EF5的子Web应用程序。升级子级Web应用程序是不可能的,因此我必须使用此技术才能使其正常工作。我遵循了此示例,将其更改myNotInheritedSectionsef6PrivateunwantedSection是该entityFramework部分。
Mohamed Nuur's

您能帮我解释为什么我的代码不能正常工作吗,这是我的代码 <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

在最近向我们的开发环境之一发布代码之后,我们得到了与此相关的错误。我们有一个应用程序,它是另一个应用程序的子级。直到昨天,这种关系在YEARS一直运转良好。

问题:
由于输入了重复的密钥,我们收到了黄色的堆栈跟踪错误。这是因为子应用程序和父应用程序的web.config都具有此密钥。但这已经存在了很多年,而且没有任何变化。为什么现在突然变成一个问题?

解决方案:
从来没有问题的原因是,键AND值始终相同。昨天我们更新了SQL连接字符串,以在连接字符串中包含应用程序名称。这使字符串变得唯一,并且突然开始失败。

如果没有对此的确切原因进行任何研究,则必须假设子应用程序继承父web.config值时,将忽略相同的键/值对。

我们能够通过像这样包装连接字符串来解决它

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

编辑:我忘了提到我在PARENTS web.config中添加了它。我不必修改孩子的web.config。

谢谢大家的帮助,节省了我们的屁股。


6

如果(据我了解),如果您试图在子应用程序的Web配置中完全阻止继承,那么建议您避免在web.config中使用标记。而是创建一个新的apppool并编辑applicationHost.config文件(位于%WINDIR%\ System32 \ inetsrv \ Config和%WINDIR%\ SysWOW64 \ inetsrv \ config中)。您只需要找到您的apppool条目并添加属性,enableConfigurationOverride="false"如以下示例所示:

<add name="MyAppPool" autoStart="true" managedRuntimeVersion="v4.0" managedPipelineMode="Integrated" enableConfigurationOverride="false">
    <processModel identityType="NetworkService" />
</add>

这将避免MyAppPool服务的应用程序中的配置继承。

马泰奥


1
MSDN说:“如果为false,则此应用程序池中的Web.config文件中的所有设置都将被忽略”,这似乎与您认为的含义不符。我希望这是正确的答案,但我无法使它正常工作。在我看来,此设置几乎意味着“完全禁止该apppool的本地web.config”
Simon_Weaver

因此,基本上,该应用程序池下的应用程序应该可以在没有web.config文件的情况下运行?我知道“忽略的web.config”是根文件夹中的那个。我成功使用了几次。确保子应用程序不依赖于根web.config中的配置(尝试在单独的根文件夹中运行子应用程序)。
Matteo Sganzetta

1
您还可以检查方法#2这个页面上,虽然我没有测试它iislogs.com/steveschofield/2009/09/20/...
利玛窦Sganzetta

我的子应用程序实际上是父应用程序的精确副本。我希望能够发布,/preview以便人们可以在发布新版本之前对其进行测试。大家总是建议<location>解决此问题,因此我很高兴阅读您的帖子。但是,The entry 'default' has already been added.即使我使用它,它也会抱怨与AppFabric相关的配置条目enableConfigurationOverride="false"
Simon_Weaver

另外,如果我enableConfigurationOverride="false"在根应用程序上进行设置,它将完全杀死该根应用程序,甚至无法正常工作:-(
Simon_Weaver 2015年


1

我们在其中一个应用程序上收到有关重复配置指令的错误。经过调查,看来是因为这个问题

简而言之,我们的根网站是ASP.NET 3.5(已添加特定库的2.0),并且我们有一个子应用程序ASP.NET 4.0。

web.config继承使ASP.NET 4.0子应用程序继承父ASP.NET 3.5应用程序的web.config文件。

但是,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中删除config部分,然后

  1. 确定您的根应用程序中不需要它们,或者是否需要
  2. 将父应用程序升级到ASP.NET 4.0(这样它就可以访问根web.config的configSections)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.