避免使用inheritInChildApplications在子Web应用程序中的web.configinheritance

我正在尝试添加

<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.configinheritance。

我应该在哪里放置

 <location inheritInChildApplications="false"> 

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

作为前面提到的答案的评论者,你不能简单地添加行…

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

…就在<configuration>下方。 相反,您需要包装要禁用inheritance的单个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 />可能适用于某些configuration部分,但还有一些需要使用<remove name="...">指令,还有一些似乎不支持。 在这些情况下,设置inheritInChildApplications="false"可能是合适的。

它需要直接在根节点<configuration>下,并且需要设置如下的path:

 <?xml version="1.0"?> <configuration> <location path="." inheritInChildApplications="false"> <!-- Stuff that shouldn't be inherited goes in here --> </location> </configuration> 

处理configurationinheritance的一个更好的方法是在你不想inheritance的子configuration中使用<clear/> 。 所以如果你不想inheritance父configuration的连接string,你可以这样做:

 <?xml version="1.0"?> <configuration> <connectionStrings> <clear/> <!-- Child config's connection strings --> </connectionStrings> </configuration> 

我把所有东西都放进去

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

除了: <configSections/><connectionStrings/><runtime/>

在某些情况下,我们不想从<configSections />inheritance一些secions,但是我们不能把<section/>标签放在<location/> ,所以我们必须创build一个<secionGroup />并把我们不需要的部分进入该组。 部分组可以稍后插入到位置标记中。

所以我们必须改变这个:

 <configSections> <section name="unwantedSection" /> </configSections> 

成:

 <configSections> <sectionGroup name="myNotInheritedSections"> <section name="unwantedSection" /> </sectionGroup> </configSections> <location path="." inheritInChildApplications="false"> <myNotInheritedSections> <unwantedSection /> </myNotInheritedSections> </location> 

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

问题:
由于重复的键被input,我们得到了一个黄色的堆栈跟踪错误。 这是因为子和父应用程序的web.config都有这个键。 但是这样的存在多年没有改变。 为什么现在突然间它的一个问题呢?

解决scheme:
这是从来没有问题的原因是因为键AND值总是相同的。 昨天我们更新了我们的SQL连接string,以便在连接string中包含应用程序名称。 这使得这个string是独一无二的,所有的突然开始失败。

没有做任何研究的确切原因,我不得不假设,当子应用程序inheritance父母web.config值,它忽略相同的键/值对。

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

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

编辑:我忘了提到,我在PARENTS web.config中添加了这个。 我没有修改孩子的web.config。

感谢大家的帮助,拯救了我们的屁股。

如果(据我所知)你试图完全阻止你的子应用程序的Webconfigurationinheritance,我build议你避免在web.config中使用标签。 而应创build一个新的应用程序池并编辑applicationHost.config文件(位于%WINDIR%\ System32 \ inetsrv \ Config和%WINDIR%\ SysWOW64 \ inetsrv \ config)。 您只需要find您的应用程序池条目,并添加属性enableConfigurationOverride="false" ,如下例所示:

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

这将避免MyAppPool提供的应用程序中的configurationinheritance。

马特奥

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

这可能对一些人有所帮助。

我们正在收到有关我们的某个应用程序的重复configuration指令的错误。 经过调查,看起来是因为这个问题 。

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

web.configinheritance导致ASP.NET 4.0子应用程序inheritance父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(取决于你的位),已经包含这些configuration部分。

然后,ASP.NET 4.0应用程序尝试将根ASP.NET 4.0 web.config和父web.config(ASP.NET 3.5应用程序的一个)合并在一起,并在节点中运行重复。

我唯一能find的解决scheme是从父web.config中删除configuration部分,然后

  1. 确定你不需要他们在你的根应用程序,或者如果你这样做
  2. 升级父应用程序到ASP.NET 4.0(所以它可以访问根web.config的configSections)