【问题标题】:Nested ASP.NET 'application' within IIS inheriting parent config values?IIS 中的嵌套 ASP.NET“应用程序”继承父配置值?
【发布时间】:2011-05-07 20:16:45
【问题描述】:

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

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

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

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

谁能解释一下为什么会发生这种情况?

【问题讨论】:

  • 他们可能来自applicationHost.config

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


【解决方案1】:

您的问题的确切解决方案取决于您看到的配置异常消息。但是,这是一个典型的问题,通常可以通过在“WebParent”的 web.config 中的 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

【讨论】:

  • 哇...我不知道这个位置标签。 ASP.NET 非常强大! :D 我在子应用程序中遇到与角色提供程序程序集相关的错误,该程序集未包含在子应用程序的 bin 文件夹中。应用此标签后,一切都按预期工作! :D
  • 这感觉像是一个肮脏的 hack,因为您要么必须将它放在任何地方(应该是默认行为)并添加 childApp 可能不使用的标签,要么测试 childApp 并“修复”每个问题。这对我来说不是“应用程序”,因为它不是在自己的上下文中运行,而是更像是在应用程序中运行的模块。必须有更好的方法来做到这一点,而无需完全托管在另一个站点下(这似乎是唯一真正的解决方案)。
  • @rainabba - 我同意肮脏的黑客感觉。我仍然没有找到一种更优雅的方式来强制子应用程序忽略父 web.config。已经 3 年了,我一直在根据需要使用这种方法(不是太频繁)......它永远不会感觉更好:-/
  • 这是一个很好的解决方案。它解决了我的许多问题,但停在sectionGroup。我没有找到任何关于sectionGroup 的工作,所以最后使用了 IIS 重写模块。在这里写下我的经历:[波斯语]bit.ly/1egxsHs
  • 关于 IIS 的第二部分为我节省了很多时间。
【解决方案2】:

如果它们重复,您必须先&lt;remove/&gt; 然后在子应用程序 web.config 中,然后添加回您想要的元素。这是假设您希望获得不同的值。如果你不这样做,那么只需省略该元素。连接字符串将是所有应用程序都可能通用的一个很好的例子 - 所以您只需要在根目录中指定它。

例子:

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

【讨论】:

  • 我明白了,所以尽管孩子在 IIS 中被定义为应用程序,但它总是会知道父母的配置吗?是否有关于每个 web.config 中哪些项目可以“复制”以及哪些项目会引发错误的一般规则(没有您上面给出的“删除”解决方案)?
  • 是的,除非您明确禁止继承,如下面的 Saul 解释的。我相信如果您在任何元素上具有相同的名称,您都会遇到异常,但您必须尝试/测试。
  • 这仍然不会处理不适用于 childApp 的继承设置,这意味着需要大量维护。似乎他们应该将其称为“模块”,因为它在另一个应用程序的上下文中运行。看起来唯一可行的解​​决方案是使用子域设置一个单独的站点以提供适当的“应用程序”上下文。
【解决方案3】:

我认为 inheritInChildApplications="false" 适用于您仍想从父级继承某些配置的情况。 如果您想完全停止继承(在这种情况下,如果我是正确的),我建议为 2 个应用程序使用 2 个单独的应用程序池,然后在 applicationHost.config 文件中应用一个没有很好记录的设置正如我在这个问题中解释的那样“Entry has already been added” - Two Separate App Pools

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

【讨论】:

    【解决方案4】:

    听从 Scott 的建议,并确保您在 IIS 中右键单击 WebChild 并选择转换为应用程序。

    【讨论】:

    • 子项已被定义为 IIS 中的应用程序,因此该选项不可用。
    猜你喜欢
    • 1970-01-01
    • 2011-09-05
    • 1970-01-01
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 2011-02-14
    • 1970-01-01
    相关资源
    最近更新 更多