ASP.NET 应用配置继承问题解析

ASP.NET应用程序中,子应用通常会继承根应用的配置文件(web.config)。这种继承机制在许多情况下非常有用,因为它允许子应用共享根应用的配置设置。然而,当配置文件中包含了特定的程序集、HTTP模块或HTTP处理程序时,这种继承可能会导致问题。例如,当访问2.0子站点时,运行时会尝试加载根web.config中引用的模块、程序集和头部,但这些可能并不存在于子站点的bin目录中,从而导致异常。

解决策略

为了解决这个问题,可以考虑以下几种方法:

  • 将DLL文件复制到子应用的bin文件夹中。
  • 配置子应用以移除引用的DLL文件。

以下步骤假设已经测试了IIS 6,并已配置好1.1版本的Web应用程序,同时在IIS 6.0中创建并配置了2.0版本的子应用。首先,确保2.0应用使用自己的应用程序池。应用程序池的凭据可以与1.1应用相同,但拥有独立的应用程序池非常重要。

假设根(1.1)应用程序的web.config文件包含以下部分:

<httpModules> <add name="Module1" type="MySuperApp.Modules, MySuperApp.Modules.Module1"/> </httpModules> <compilation batch="true" debug="true" defaultLanguage="vb" batchTimeout="30"/> <assemblies> <add assembly="MySuperApp.Specialized.Utilis"/> <add assembly="MySuperApp.SomeOtherStuff"/> </assemblies> <httpHandlers> <add type="MySuperApp.Handlers.BobHandler, MySuperApp.Bob" validate="false" path=".bob" verb="GET"/> </httpHandlers>

以上引用告诉运行时加载所需的DLL文件。由于web.config文件是“继承下来”的,因此需要在子应用的配置文件中移除这些引用。2.0应用的web.config文件应该包含以下内容:

<compilation debug="true"> <assemblies> <remove assembly="MySuperApp.Specialized.Utilis"/> <remove assembly="MySuperApp.SomeOtherStuff"/> </assemblies> </compilation> <httpModules> <clear/> <add name="Session" type="System.Web.SessionState.SessionStateModule"/> </httpModules> <httpHandlers> <remove verb="GET" path=".bob"/> </httpHandlers>

以上所有内容都位于system.web节点内。特别注意httpModules部分,这里使用了Clear而不是显式移除。这样做的目的是,当子应用需要扩展为完整的根(独立)网站时,无需修改配置文件。

注意事项

虽然这种方法在特定情况下有效,但也有其他人声称它不起作用,作为最后的手段,他们不得不将DLL包含在bin文件夹中。如果还有其他解决方案,请分享。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485