如何保持AppDomain中的ASP.NET程序集活着?

场景:我已经使用Web部署项目部署了一个n层企业ASP.NET应用程序。 所有层都生成ASP.NET应用程序使用的独立程序集。

问题:当我运行应用程序。 在部署之后第一次需要花费很多时间在内存中加载相关的程序集。 但一旦加载它的照明快速应用程序。 如果没有用户访问应用程序,IIS将从内存中卸载程序集,并且当用户试图在稍后的实例上访问该应用程序时,它将继续加载所有程序集,再次花费相同的时间加载它需要这样做的第一次。

我正在寻找一个解决scheme,使我能够将我的程序集永久地加载到内存中,覆盖程序集对存储器驻留的不稳定性。

或任何其他的解决scheme,让我的用户愉快地使用应用程序解决上述问题。

IIS 6中 ,转到“应用程序池”部分,然后右键单击承载相关ASP.NET应用程序的池上的“属性”。 转到“性能”选项卡,并取消选中“在空闲后closures工作进程:”

IIS 7中 ,转至“连接”窗格并find“应用程序池”,然后为托pipe应用程序的池select“高级设置”。 find“空闲超时”属性并将其设置为“0”(禁用它)。

默认是20分钟不活动。 通过取消选中该框,一旦你的AppDomain被工作进程加载,它永远不会死(除非你杀了进程或当然)。 默认情况下,IIS会在进程达到某个限制(例如内存限制)时重新启动进程 ,但是它也会启动一个新的进程 ,并且将所有进入的请求“分阶段”,直到旧的未使用为止,以尽量减less中断。

我还写了一个小的c#类,它将保持您的ASP.NET应用程序在正常情况下保持活动 ( 备用存档版本 )。 由于它在应用程序中运行,显然它不能阻止IIS或任何其他显式地终止进程,但它会使应用程序“热”,例如,应用程序将永远不会闲置足够长的时间让IIS决定closures它。

如果你没有直接控制你的IISconfiguration(例如共享主机),最好的办法是在一个单独的系统上运行一个小应用程序 – 比如一个永远在线的工作站 – 每隔x分钟就会打一个网站应用程序池从超时。 没有什么奇特的 – 一个简单的WebRequest和一个while()循环在控制台应用程序中可以做到。

ASP.net的一个优点是可以创build对象的静态(共享)实例。

为了避免外部进程的必要性,你可以在(每个例子)global.asax中创build一个静态定时器,这个静态定时器使用一个简单的WebRequest调用域上的一个页面。 在这种方式下,网站保持活跃,直到池的手动重置完成。

我写了一个小小的C#控制台应用程序,通过Windows任务计划程序,每隔10分钟让我的4个站点保持活动状态。 生活再次好起来。 我们不会在凌晨2点到5点之间运行应用程序,所以服务器可以对内存进行清理,如果这个问题更重要的话。 对于我们的网站,在那个时候很less有人在这个时间。