我有一些松散耦合的代码,这些代码取决于加载到当前应用程序域中的特定程序集:
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>
看起来好像有效,但我不确定它是否可靠。
如何强制将该特定程序集加载到应用程序域中而不在代码中引入依赖项?
这是错误的方法,可能会导致严重的定时错误。
该设置会影响 ASP.NET 编译,因此仅在编译 ASP.NET 视图时强制加载程序集,并且最多编译一次 - 无论是在第一次请求视图时还是在就地预编译过程中(如果设置了后者) 。不管怎样,之后会有一段时间不需要编译 ASP.NET 视图。
现在,IIS 应用程序池每 29 小时自动回收一次。当池回收时,它会启动一个新的工作进程,并且该进程开始托管站点负载。重要的是 ASP.NET 视图在此过程中不会更改,因此不需要重新编译它们,因此不会调用编译过程,因此中列出的程序集<system.web><compilation><assemblies>
不强制加载。
所以这个东西看起来可以工作,直到 29 小时过去,然后就崩溃了。
需要更好的解决方案。类似于设置中的东西<appSettings>
说明 Azure 运行时是否应该可用。如果设置已设置,则代码可以首次调用 Azure 运行时程序集中的代码,这将使它们加载。如果未设置该设置,则不会尝试调用该代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)