我目前在IIS7中有2个ASP.NET 3.5 Web应用程序(我们称之为WebParent和WebChild)。
WebChild嵌套在IIS7中的WebParent列表中,并设置为应用程序(而不仅仅是WebParent中的虚拟目录)。两者目前都使用自己的(经典)应用程序池。
WebParent和WebChild都在自己的根目录中有自己完全定义的web.config文件。
我曾认为,当WebChild被定义为IIS中的“应用程序”时,它不会从WebParent配置文件继承任何内容。但是,尽管有这样的配置,我看到web.config中的各种元素的错误已经被定义(这是正确的,两个配置文件中都有一些项目,但我认为它们应该完全独立于一个另一个)?
有人可以澄清为什么会发生这种情况吗?
答案 0 :(得分:61)
问题的确切解决方案取决于您看到的配置异常消息。但是,这是一个典型的问题,通常可以通过使用web.config中“WebParent”的location元素的inheritInChildApplications属性来解决。通过将整个system.web部分包装在location元素中,如下所示,您应该能够消除所描述的问题:
<location path="." inheritInChildApplications="false">
<system.web>
<!-- ... -->
</system.web>
</location>
使用IIS 7,您还需要以相同的方式包装system.WebServer部分:
<location path="." inheritInChildApplications="false">
<system.webServer>
<!-- ... -->
</system.webServer>
</location>
此解决方案基于我发现的一篇优秀博客文章here。
答案 1 :(得分:15)
如果重复这些内容,则必须首先在子应用程序web.config中<remove/>
,然后添加您喜欢它的元素。这假设你想拥有不同的价值。如果不这样做,那么只需省略元素即可。连接字符串将是所有应用程序可能常见的一个很好的示例 - 因此您只需要在根目录中指定它。
示例:
<siteMap defaultProvider="AdminSiteMapProvider" enabled="true">
<providers>
<remove name="AdminSiteMapProvider"/>
<add name="AdminSiteMapProvider" description="Admin SiteMap provider" type="System.Web.XmlSiteMapProvider" siteMapFile="~/App_Data/admin.sitemap" securityTrimmingEnabled="true" />
</providers>
</siteMap>
答案 2 :(得分:3)
我认为inheritInChildApplications =&#34; false&#34;适用于您仍希望从父级继承部分配置的情况。 如果你想完全停止继承(在这种情况下,如果我是正确的话),我建议为2个应用程序使用2个独立的应用程序池,然后在我在这个问题“Entry has already been added” - Two Separate App Pools
中解释的applicationHost.config文件<add name="MyAppPool" autoStart="true" managedRuntimeVersion="v4.0" managedPipelineMode="Integrated" enableConfigurationOverride="false">
<processModel identityType="NetworkService" />
</add>
答案 3 :(得分:-1)
遵循Scott的建议并确保您在IIS中右键单击了WebChild并选择了转换为应用程序。