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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (29)

场景:我使用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调用域上的页面。在这种方式下,网站自己保持活跃状态​​,直到完成池的手动重置。

扫码关注云+社区