我想我听说ASP.NET应用程序会在闲置一段时间后关闭(即没有访问者)。您可以阻止ASP.NET应用程序关闭吗?
有没有办法阻止这种行为发生?我有一个计时器,它运行global.asax.cs application_start事件中的一些代码,并且要确保它继续运行,即使没有访问者访问该网站。
在此先感谢!
我想我听说ASP.NET应用程序会在闲置一段时间后关闭(即没有访问者)。您可以阻止ASP.NET应用程序关闭吗?
有没有办法阻止这种行为发生?我有一个计时器,它运行global.asax.cs application_start事件中的一些代码,并且要确保它继续运行,即使没有访问者访问该网站。
在此先感谢!
你可以通过几种方法来实现。
如果您处于选项二下,我强烈建议使用外部源,因为管理较少,并且如果您没有可用于配置的IIS,则很可能没有可用的服务器添加一个ping应用程序。
另外,我不建议的东西,在过程与Web应用程序坐镇,因为我已经发现,那些可能会引发问题,当应用程序确实需要回收...
最后一个思想
如果你确实去修改IIS空闲超时的路线,我建议设置应用程序池的定期回收。由于许多Web应用程序确实从周期性回收中受益,并且最常见的空闲超时是最大的正常回收因素。
+1为外部保持活力,另一个+1(如果我可以)推荐将计时器代码移入服务。 – 2009-08-20 14:04:13
+1外部keeep活得很好。你甚至可以编写自己的服务来运行服务器以保持网站的活力。 – Audioillity 2009-08-20 14:11:05
将“空闲超时”设置为零以完全禁用循环。另请参阅此处:https://stackoverflow.com/questions/1596267/how-to-disable-the-application-pool-idle-time-out-in-iis7 – 2016-09-14 09:25:40
在IIS 6中,转至“应用程序池”部分,然后右键单击托管相关ASP.NET应用程序的池上的“属性”。转到“性能”选项卡,并取消选中“空闲后关闭工作进程:”
在IIS 7中,转至“连接”窗格并找到“应用程序池”,然后为承载应用程序的池选择“高级设置”。找到“空闲超时”属性并将其设置为“0”(禁用它)。
缺省值为20分钟不活动。通过取消选中该框,一旦你的AppDomain被工作进程加载,它就永远不会死亡(除非你杀死了进程或当然)。默认情况下,IIS会在进程达到某个限制(例如内存限制)时回收进程,但它也会启动一个新进程并“分阶段”处理所有进入的请求,直到旧进程未使用为止,以便最大限度地减少中断。
如果你没有直接控制你的IIS配置(例如共享主机),最好的方法是在独立的系统上运行一个小应用程序 - 比如说一个永远在线的工作站 - 每隔一个系统就会触发你的网站x分钟以防止应用程序池超时。没有什么奇特的 - 控制台应用程序中的一个简单的WebRequest和一个while()循环就可以做到。
转到您的任务管理器并杀死w3wp.exe(或aspnet_wp)。没有什么可以阻止你这样做。底线,ASP.NET应用程序不能承担连续的功能。
但是,您可以启动一个单独的线程,该线程不会受到空闲超时的限制 - 只要它有要做的事情。我使用这种技术来控制45分钟的导入,无论是否有人在网站上都会继续导入。我使用了一个事务日志和Application_Start,这样当这个过程被回收时,它会从中断的地方继续。
除了外部永葆可以使内部永葆内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;
}
}
}
理论上巧妙!但有人试过吗?它工作吗?此外,如果您在外部执行此操作,并且在app_start后每隔21分钟执行一次此操作,则会回收并重新启动。将最后一次启动时间和关闭时间写入数据库,然后在完成每次回收后可以使用Windows服务重新启动它。 – 2016-09-14 09:45:30
我在发布前测试过 – Eduardo 2016-10-04 14:40:51
根据所运行的代码,我会作出这样的服务器上运行的Windows服务。 – Martin 2009-08-20 13:59:55
理想情况是,这段代码应该在服务中。然而,为了灵活性和可移植性,我们决定让代码从global.asax.cs运行。 – 2009-08-20 14:03:21