我想我听说ASP.NET应用程序会在闲置一段时间后关闭(即没有访问者)。
有没有办法防止这种行为发生?我有一个计时器,它运行来自global.asax.cs application_start事件的一些代码,并希望确保它继续运行,即使没有访问者访问该站点。
提前致谢!
答案 0 :(得分:27)
你可以通过几种方式实现。
如果您在选项二下,我强烈建议使用外部源,因为它管理较少,如果您没有可配置的IIS,则很可能没有可用的服务器来添加ping申请。
此外,我不建议使用Web应用程序进行处理,因为我发现当应用程序确实需要回收时会出现问题......
最后一个想法
如果您确实采用了修改IIS空闲超时的路线,我建议您设置应用程序池的常规回收。由于许多Web应用程序确实受益于定期循环,最常见的是空闲超时是最大的常规循环因子。
答案 1 :(得分:18)
除了外部保持活着,你可以在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;
}
}
}
答案 2 :(得分:7)
在IIS 6中,转到“应用程序池”部分,然后右键单击>承载有问题的ASP.NET应用程序的池上的属性。转到“性能”选项卡,取消选中“空闲后关闭工作进程:”
在IIS 7中,转到“连接”窗格并找到“应用程序池”,然后为承载应用程序的池选择“高级设置”。找到“空闲超时”属性并将其设置为“0”(这会禁用它)。
默认值为20分钟不活动。通过取消选中该框,一旦您的AppDomain被工作进程加载,它将永远不会死亡(除非您终止进程或其他事情)。默认情况下,IIS将在达到某个限制(例如内存上限)时回收该进程,但它也将启动一个新进程并“逐步”处理所有传入请求,直到旧的请求未使用,以便最大限度地减少中断。 / p>
如果您无法直接控制IIS配置(例如,共享主机),最好的办法是在一个单独的系统上运行一个小应用程序 - 比如一个永远在线的工作站 - 每个x都会访问您的网站几分钟,以防止应用程序池超时。没什么好看的 - 控制台应用程序中的简单WebRequest和while()循环都可以。
答案 3 :(得分:0)
转到您的任务管理器并杀死w3wp.exe(或aspnet_wp)。没有什么可以阻止你这样做。最重要的是,ASP.NET应用程序无法承担连续的功能。
但是,您可以启动一个单独的线程,只要它有事可做,它就不会受到空闲超时的影响。我已经使用这种技术来控制45分钟的导入,无论是否有人在网站上都可以继续导入。我使用了一个事务日志和Application_Start,这样当流程被回收时,它就会从中断的地方开始。