避免ASP.NET子应用程序中继承的ELMAH错误

时间:2014-08-26 11:11:37

标签: asp.net elmah web-config

我有一个使用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>

据我所知,无法阻止<configSections>继承,请参阅例如How to stop inheritance of <configSections>in Web.Config。有没有办法运行我的无ELMAH子应用程序呢?

2 个答案:

答案 0 :(得分:1)

由于父配置,您无法保持子应用程序不受ELMAH限制。但是 - 因为我想你不想从父级引用程序集 - 你可以做的是用探测配置告诉你的子应用程序look for assemblies in the parent bin folder

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


编辑:这确实是一个无赖。 Clearing and removing configsections tags was considered too complex by Microsoft

  

<clear /><remove />从未为configSections和sectionGroups实现,因为尝试合并相同节处理程序和节组的不同定义存在困难。

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

答案 1 :(得分:0)

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

来自MSDN docs

  

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

有两种方法可以执行此操作,其中ChildApplicationName应替换为应用程序池名称的值。

方法1(首选/建议):

在管理员模式{/ 3>} 中执行以下命令

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

方法2:

第二个涉及直接编辑%windir%\System32\inetsrv\config\applicationHost.config文件,允许应用程序有效地忽略父应用程序。出于各种原因,我不建议这样做,但我把这个留给后人。

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

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