关于iis:如何使AppDomain中的ASP.NET程序集保持活动状态?

How to keep ASP.NET assemblies in AppDomain alive?

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

问题:当我运行应用程序时。部署后第一次在内存中加载依赖程序集需要很多时间。但一旦加载了它的快速照明应用程序。如果没有用户访问该应用程序,则IIS将从内存中卸载程序集,当用户试图在以后的实例中访问该应用程序时,它将再次加载所有程序集,所需的加载时间与第一次相同。

我正在寻找一种解决方案,使我能够将程序集持久地加载到内存中,从而将程序集的易失性覆盖到内存驻留中。

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


在IIS 6中,转到"应用程序池"部分,然后右键单击托管有问题的ASP.NET应用程序的池上的"属性"。转到"性能"选项卡,取消选中"空闲以下时间后关闭工作进程:"。

在IIS 7中,转到"连接"窗格并查找应用程序池,然后为承载应用程序的池选择高级设置。找到"空闲超时"属性并将其设置为"0"(这将禁用它)。

默认为20分钟不活动。通过取消选中该框,一旦工作进程加载了您的AppDomain,它将永远不会死(除非您终止进程或其他进程)。默认情况下,当进程达到某个限制(如内存上限)时,IIS将回收该进程,但它还将启动一个新的进程,并"逐步"处理所有传入的请求,直到旧的请求未使用为止,以便将中断降到最低。

我还编写了一个小的C类,在正常情况下,它将使您的ASP.NET应用程序保持活动(备用存档版本)。由于它在应用程序中运行,很明显它不能阻止IIS或其他任何东西显式地终止进程,但它将使应用程序保持"热",例如,应用程序将永远不会空闲足够长的时间,以便IIS决定关闭它。

如果您不能直接控制您的IIS配置(例如共享主机),您最好的选择是在一个单独的系统上运行一个小应用程序-例如,一个始终在工作台上的应用程序-它每X分钟访问一次您的站点,以防止应用程序池超时。没什么特别的-一个简单的webrequest和一个控制台应用程序中的while()循环就可以了。


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

为了避免外部进程的必要性,可以在global.asax中创建一个静态计时器(每个示例),该计时器使用简单的webrequest调用域中的页面。通过这种方式,该站点可以自己保持活动状态,直到完成池的手动重置。


我写了一个小的C控制台应用程序,通过Windows任务调度器每10分钟保持4个站点的活动状态。生活再次美好。我们不会在凌晨2点到5点运行这个应用程序,只是为了让服务可以清理内存,如果这很重要的话。对于我们的网站来说,在那些时间里很少有人打开。