场景:我使用Web部署项目部署了一个n层企业ASP.NET应用程序。所有层都生成ASP.NET应用程序使用的独立程序集。
问题:当我运行应用时。部署后第一次将相关程序集加载到内存中需要花费大量时间。但一旦加载其照明快速应用程序。如果没有用户访问该应用程序,IIS将从内存中卸载程序集,当用户尝试在以后的实例上访问该应用程序时,它会再次加载所有程序集,并且需要花费相同的时间来加载它这是第一次这样做。
我正在寻找一种解决方案,使我能够将我的程序集加载到内存中,始终将程序集的易变性改为内存驻留。
或者让我的用户愉快地使用该应用解决上述问题的任何其他解决方案。
答案 0 :(得分:72)
在 IIS 6 中,转到“应用程序池”部分,然后右键单击>承载有问题的ASP.NET应用程序的池上的属性。转到“性能”选项卡,取消选中“空闲后关闭工作进程:”
在 IIS 7 中,转到“连接”窗格并找到“应用程序池”,然后为托管应用程序的池选择“高级设置”。找到“空闲超时”属性并将其设置为“0”(这会禁用它)。
默认值为20分钟不活动。通过取消选中此框,一旦AppDomain加载worker process,它就永远不会死亡(除非你杀死进程或其他事情)。默认情况下,IIS会在达到某个限制时recycle the process,例如内存上限,但它也会启动一个新的并且“逐步”处理所有传入请求,直到旧的请求未使用,以便最大限度地减少中断
我还写了一个小的c#类,在正常情况下会keep your ASP.NET application alive(alternate archived version)。由于它在应用程序中运行,显然它不能阻止IIS或其他任何东西明确地杀死进程,但它会使应用程序保持“热”,例如该应用程序将永远不会闲置足够长的时间让IIS决定关闭它。
如果您无法直接控制IIS配置(例如,共享主机),最好的办法是在一个单独的系统上运行一个小应用程序 - 比如一个永远在线的工作站 - 每个x都会访问您的网站几分钟,以防止应用程序池超时。没什么好看的 - 控制台应用程序中的简单WebRequest和while()循环都可以。
答案 1 :(得分:3)
ASP .net的一个优点是可以创建对象的静态(共享)实例。
为了避免外部进程的必要性,您可以在(每个示例)global.asax中创建一个静态计时器,该计时器通过简单的WebRequest调用域上的页面。通过这种方式,该站点可以自行维持,直到完成池的手动重置为止。
答案 2 :(得分:0)
我写了一个小的C#控制台应用程序,通过Windows任务调度程序每10分钟让我的4个站点保持活动状态。生活再一次美好。我们不会在凌晨2点到凌晨运行该应用程序,因此即使重要,服务也可以进行任何内存清理。对于我们的网站,那时候很少有人在这些时间。