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

我想加上

<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.config继承的,这会导致问题。

我到底应该把它放在哪里

<location inheritInChildApplications="false">

所以它忽略了所有的 web.config 设置?

203504 次浏览

它需要直接到根 <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>

正如前一个答案的评论者所提到的,您不能简单地添加..。

<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"可能是合适的。

这是微软在 location标签上的页面: http://msdn.microsoft.com/en-us/library/b6x6shw7%28v=vs.100%29.aspx

也许对某些人有帮助。

我们的一个应用程序出现了重复配置指令的错误。 经过调查,似乎是因为 这个问题

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

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)

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

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

解决办法:
之所以从来没有问题,是因为键和值总是相同的。昨天我们更新了 SQL 连接字符串,以便在连接字符串中包含 ApplicationName。这使得弦独一无二,突然开始失效。

在不研究确切原因的情况下,我必须假设当子应用程序继承父 web.config 值时,它会忽略相同的键/值对。

我们可以通过像这样包装连接字符串来解决这个问题

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

编辑: 我忘了说我在 PaRENTS web.config 中添加了这个。我不需要修改孩子的 web.config。

谢谢大家的帮助,救了我们的命。

如果(据我所知)您试图在子应用程序的 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 提供的应用程序中的配置继承。

马迪奥

我把所有东西都放在:

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