避免使用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.config
inheritance。
我应该在哪里放置
<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部分,然后
- 确定你不需要他们在你的根应用程序,或者如果你这样做
- 升级父应用程序到ASP.NET 4.0(所以它可以访问根web.config的configSections)
- 如何configurationstream利的NHibernate输出查询,而不是控制台跟踪或debugging?
- 找不到适合特定文化或中性文化的资源
- 使用ADO.Net传递表值参数
- 请求redirect到/ Account / Login?ReturnUrl =%2f,因为MVC 3安装在服务器上
- 如何允许使用ASP.NET下载.json文件
- 为什么ASP.NET webforms需要Runat =“Server”属性?
- 从运行在ASP.net中的Web引用客户端获取RAW Soap数据
- WCF Web服务错误:服务无法激活,因为它不支持ASP.NET兼容性
- 如何防止“aspxerrorpath”作为查询string传递给ASP.NET自定义错误页面