你能阻止你的ASP.NET应用程序关闭吗?

我想我听说ASP.NET应用程序会在闲置一段时间后关闭(即没有访问者)。

有没有办法防止这种行为发生? 我有一个计时器,它运行来自global.asax.cs application_start事件的一些代码,并希望确保它继续运行,即使没有访问者访问该站点。

提前致谢!

你可以通过几种方式做到这一点。

  1. 如果您可以控制IIS,则可以更改应用程序池中的“空闲超时”,默认情况下为20分钟。
  2. 如果您无法控制IIS(共享或其他主机),则可以使用外部服务ping该站点。 MyWebKeepAlive或Pingdom是很好的选择。

如果您在选项二下,我强烈建议使用外部源,因为它管理较少,如果您没有可配置的IIS,则很可能没有可用于添加ping应用程序的服务器。

另外,我不推荐与Web应用程序进行同步处理的东西,因为我发现当应用程序确实需要回收时会出现问题……

最后一个想法

如果您确实采用了修改IIS空闲超时的路线,我建议您设置应用程序池的常规回收。 由于许多Web应用程序确实受益于定期循环,并且最常见的是空闲超时是最大的常规循环因子。

除了外部保持活动,你可以在global.asax内部保持活着:

  static Thread keepAliveThread = new Thread(KeepAlive); protected void Application_Start() { keepAliveThread.Start(); } protected void Application_End() { keepAliveThread.Abort(); } static void KeepAlive() { while (true) { WebRequest req = WebRequest.Create("http://www.mywebsite.com/DummyPage.aspx"); req.GetResponse(); try { Thread.Sleep(60000); } catch (ThreadAbortException) { break; } } } 

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

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

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

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

转到您的任务管理器并杀死w3wp.exe(或aspnet_wp)。 没有什么可以阻止你这样做。 最重要的是,ASP.NET应用程序无法承担连续function。

但是,您可以启动一个单独的线程,该线程不会受到空闲超时 – 只要它有事可做。 我已经使用这种技术来控制45分钟的导入,无论是否有人在网站上都可以继续导入。 我使用了一个事务日志和Application_Start,这样当流程被回收时,它就会从中断的地方开始。