50

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

问题:当我运行应用程序时。部署后第一次需要花费大量时间将依赖程序集加载到内存中。但是一旦加载了它的快速照明应用程序。如果没有用户访问该应用程序,IIS 会从内存中卸载程序集,当用户尝试在以后的实例上访问该应用程序时,它会再次加载所有程序集,加载时间与加载时间相同第一次这样做。

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

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

4

3 回答 3

72

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

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

默认值为 20 分钟不活动。通过取消选中该框,一旦您的AppDomain工作进程加载,它将永远不会死亡(除非您杀死进程或其他东西)。默认情况下,IIS 会在进程达到某个限制(例如内存上限)时回收该进程,但它也会启动一个新进程并“逐步处理”所有传入请求,直到旧请求未被使用,以最大程度地减少中断。

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

如果您无法直接控制您的 IIS 配置(例如共享主机),那么最好的办法是让一个小型应用程序在单独的系统上运行 - 例如,永远在线的工作站 - 每 x 分钟访问您的站点以保持应用程序池超时。没什么特别的——一个简单的WebRequest和一个控制台应用程序中的 while() 循环就可以了。

于 2009-05-08T05:23:23.460 回答
3

One of the advantages of ASP .net is the posibility to create static (shared) instances of objects.

To avoid the necessity of an external process you can create an static timer in (per example) global.asax which calls for a page on the domain with a simple WebRequest. On this way the site keeps alive himself until a manual reset of the pool is done.

于 2011-07-18T16:38:34.757 回答
0

I wrote a little C# console application that keeps my 4 sites alive every 10 mins via windows task scheduler. Life is once again good. We do not run the app from 2-5am just so the serves can do any cleanups of memory, if it even matters. for our sites there is rarely anyone on at those hours anyway.

于 2010-03-03T04:30:05.803 回答