我有一个使用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子应用程序呢?
答案 0 :(得分:1)
由于父配置,您无法保持子应用程序不受ELMAH限制。但是 - 因为我想你不想从父级引用程序集 - 你可以做的是用探测配置告诉你的子应用程序look for assemblies in the parent bin folder。
这样,您的子应用程序不需要知道父项的存在哪些程序集,只有在需要未知程序集时才可以在父文件夹中找到它
<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>