【问题标题】:Avoid inherited ELMAH errors in an ASP.NET subapplication避免 ASP.NET 子应用程序中的继承 ELMAH 错误
【发布时间】:2014-10-19 16:43:26
【问题描述】:

我有一个使用 ELMAH 的父 IIS 应用程序和一个不使用 ELMAH 的子 ASP.NET 应用程序(虚拟目录)。当我尝试浏览我的子应用程序时,我收到此错误:

无法加载文件或程序集“Elmah”或其依赖项之一。系统找不到指定的文件。

这是可以理解的,因为我的子应用程序的 bin 文件夹不包含任何 ELMAH 程序集。

问题可能是父 web.config 文件包含以下内容:

  <configSections>      
    <sectionGroup name="elmah">
      <section name="security" requirePermission="false" type="Elmah.SecuritySectionHandler, Elmah" />
      <section name="errorLog" requirePermission="false" type="Elmah.ErrorLogSectionHandler, Elmah" />
      <section name="errorMail" requirePermission="false" type="Elmah.ErrorMailSectionHandler, Elmah" />
      <section name="errorFilter" requirePermission="false" type="Elmah.ErrorFilterSectionHandler, Elmah" />
    </sectionGroup>
  </configSections>

据我了解,没有办法阻止&lt;configSections&gt; 继承,请参阅例如How to stop inheritance of <configSections>in Web.Config。那么有没有办法运行我的无 ELMAH 子应用程序?

【问题讨论】:

    标签: asp.net elmah web-config


    【解决方案1】:

    由于父配置,您不能让您的子应用程序没有 ELMAH。但是 - 因为我想你不想从父级引用程序集 - 你可以做的是用探测配置告诉你的子应用程序到 look for assemblies in the parent bin folder

    这样,您的子应用程序不需要知道父应用程序存在哪些程序集,只需知道如果需要未知程序集,就可以在父文件夹中找到它


    编辑:这确实很糟糕。 Clearing and removing configsections tags was considered too complex by Microsoft

    &lt;clear /&gt;&lt;remove /&gt; 从未为 configSections 和 sectionGroups 实现,因为在尝试合并相同部分处理程序和部分组的不同定义时存在困难。

    因此路径解决方法。如果这很关键,您还可以设置应用程序,使它们在层次结构方面不相关

    【讨论】:

    • “由于父配置,您不能让您的子应用程序不使用 ELMAH。”真的吗?那就太可惜了,这两个应用程序没有任何共同点,也不应该相互继承任何东西。
    • 能否请您扩展您的最后一行?解决方法是什么?谢谢。
    • 如果您向子应用程序添加到父应用程序 bin 文件夹的探测路径,应用程序将能够找到父应用程序所需的任何程序集,而无需引用它。请参阅答案中的链接
    • @samy 探测路径Specifies subdirectories of the application's base directory that might contain assemblies. 那么如何在父应用bin文件夹中添加探测路径,父应用不可能是子应用的子目录。我误会了吗?
    【解决方案2】:

    我发现将enableConfigurationOverride="false" 添加到应用程序池定义可以解决此问题。

    来自MSDN docs

    可选的布尔属性。如果为 true,则表示将为此应用程序池中的应用程序处理 Web.config 文件中的委派设置。为 false 时,将忽略此应用程序池的 Web.config 文件中的所有设置。默认值为 true。

    有两种方法可以做到这一点,其中ChildApplicationName 应替换为您的应用程序池名称的值。

    方法 1(首选/建议):

    appcmd中执行以下命令在管理员模式下

    appcmd.exe set config -section:system.applicationHost/applicationPools /[name='ChildApplicationName'].enableConfigurationOverride:"False" /commit:apphost
    

    方法二:

    第二个涉及直接编辑%windir%\System32\inetsrv\config\applicationHost.config 文件,允许应用程序有效地忽略父应用程序。由于各种原因,我不建议这样做,但我将其留在这里以供后代使用。

    为了进行设置,请搜索您的子应用程序池名称。它应该在 xpath 下。 /configuration/system.applicationHost/applicationPools.

    <configuration>
      <system.applicationHost>
        <applicationPools>
          ...
          <add name="ChildApplicationName" enableConfigurationOverride="false" />
          ...
        <applicationPools>
      <system.applicationHost>
    <configuration>
    

    【讨论】:

      猜你喜欢
      • 2021-04-26
      • 1970-01-01
      • 2010-11-27
      • 2019-02-04
      • 1970-01-01
      • 2015-01-07
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      相关资源
      最近更新 更多