2009-08-20 80 views
14

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

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

在此先感谢!

+1

根据所运行的代码,我会作出这样的服务器上运行的Windows服务。 – Martin 2009-08-20 13:59:55

+0

理想情况是,这段代码应该在服务中。然而,为了灵活性和可移植性,我们决定让代码从global.asax.cs运行。 – 2009-08-20 14:03:21

回答

25

你可以通过几种方法来实现。

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

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

另外,我不建议的东西,在过程与Web应用程序坐镇,因为我已经发现,那些可能会引发问题,当应用程序确实需要回收...

最后一个思想

如果你确实去修改IIS空闲超时的路线,我建议设置应用程序池的定期回收。由于许多Web应用程序确实从周期性回收中受益,并且最常见的空闲超时是最大的正常回收因素。

+0

+1为外部保持活力,另一个+1(如果我可以)推荐将计时器代码移入服务。 – 2009-08-20 14:04:13

+1

+1外部keeep活得很好。你甚至可以编写自己的服务来运行服务器以保持网站的活力。 – Audioillity 2009-08-20 14:11:05

+0

将“空闲超时”设置为零以完全禁用循环。另请参阅此处:https://stackoverflow.com/questions/1596267/how-to-disable-the-application-pool-idle-time-out-in-iis7 – 2016-09-14 09:25:40

7

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

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

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

如果你没有直接控制你的IIS配置(例如共享主机),最好的方法是在独立的系统上运行一个小应用程序 - 比如说一个永远在线的工作站 - 每隔一个系统就会触发你的网站x分钟以防止应用程序池超时。没有什么奇特的 - 控制台应用程序中的一个简单的WebRequest和一个while()循环就可以做到。

0

转到您的任务管理器并杀死w3wp.exe(或aspnet_wp)。没有什么可以阻止你这样做。底线,ASP.NET应用程序不能承担连续的功能。

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

13

除了外部永葆可以使内部永葆内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; 
      } 
     } 
    } 
+0

理论上巧妙!但有人试过吗?它工作吗?此外,如果您在外部执行此操作,并且在app_start后每隔21分钟执行一次此操作,则会回收并重新启动。将最后一次启动时间和关闭时间写入数据库,然后在完成每次回收后可以使用Windows服务重新启动它。 – 2016-09-14 09:45:30

+1

我在发布前测试过 – Eduardo 2016-10-04 14:40:51

相关问题