IIS中的嵌套ASP.NET“应用程序”继承父配置值?

时间:2010-11-10 11:45:11

标签: asp.net iis-7 web-config

我目前在IIS7中有2个ASP.NET 3.5 Web应用程序(我们称之为WebParent和WebChild)。

WebChild嵌套在IIS7中的WebParent列表中,并设置为应用程序(而不仅仅是WebParent中的虚拟目录)。两者目前都使用自己的(经典)应用程序池。

WebParent和WebChild都在自己的根目录中有自己完全定义的web.config文件。

我曾认为,当WebChild被定义为IIS中的“应用程序”时,它不会从WebParent配置文件继承任何内容。但是,尽管有这样的配置,我看到web.config中的各种元素的错误已经被定义(这是正确的,两个配置文件中都有一些项目,但我认为它们应该完全独立于一个另一个)?

有人可以澄清为什么会发生这种情况吗?

4 个答案:

答案 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并选择了转换为应用程序。