如何强制将特定程序集加载到MVC 2应用程序的每个应用程序域中?

时间:2011-10-12 15:19:37

标签: .net asp.net asp.net-mvc iis reflection

我有一些松散耦合的代码,它依赖于加载到当前应用程序域的特定程序集:

Assembly assembly = AppDomain.CurrentDomain.GetAssemblies().Where(
    candidateAssembly => candidateAssembly.FullName.StartsWith("Microsoft.WindowsAzure.ServiceRuntime")).SingleOrDefault();

并且该代码在MVC 2应用程序内执行并产生null引用,因为该程序集未加载到当前应用程序域中。我可以从该程序集中调用一些代码,但这会在该程序集上引入应用程序代码的强依赖性,而且我不再有松耦合。

我需要强制IIS(或其他任何东西)在我的代码运行之前将该程序集加载到应用程序域中。我尝试编写IHttpModule的实现并将其列在web.config中,但它没有帮助。

到目前为止,我尝试在<system.web><compilation><assemblies>下添加程序集,看起来有效,但我不确定它是否可靠。

如何在不在代码中引入依赖项的情况下强制将特定程序集加载到应用程序域中?

1 个答案:

答案 0 :(得分:0)

这是错误的方式,它可能导致严重的定时错误。

该设置会影响ASP.NET编译,因此它只强制在编译ASP.NET视图时加载程序集,并且最多只编译一次 - 在第一次请求视图时或在就地预编译过程中(如果后者是设置。无论如何,会有一段时间没有需要编译ASP.NET视图。

现在有一个IIS apppool每29小时自动回收一次。当池重新开始时,它会启动一个新的工作进程,该进程开始托管站点有效负载。重要的是ASP.NET视图在此过程中不会更改,因此无需重新编译它们,因此不会调用编译过程,因此<system.web><compilation><assemblies>中列出的程序集不会被强制加载。

所以事情看起来一直有效,直到29个小时过去然后才会崩溃。

需要更好的解决方案。类似于<appSettings>中的设置,说明Azure Runtime是否可用。如果设置了该设置,则代码可以首先调用Azure Runtime程序集中的代码,这将使它们加载。如果未设置该设置,则不会尝试调用该代码。