【问题标题】:Can you prevent your ASP.NET application from shutting down?你能阻止你的 ASP.NET 应用程序关闭吗?
【发布时间】:2010-11-21 08:09:06
【问题描述】:

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

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

提前致谢!

【问题讨论】:

  • 根据运行的代码,我会将其设为在服务器上运行的 Windows 服务。
  • 理想情况下是的,这段代码应该在服务中。然而,为了灵活性和可移植性,我们决定让代码从 global.asax.cs 运行。

标签: c# asp.net iis


【解决方案1】:

除了外部保持活动,您还可以在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服务重启。
  • 发帖前测试过
【解决方案2】:

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

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

如果您选择第二个选项,我强烈建议您使用外部源,因为它管理起来比较简单,而且如果您没有 IIS 可用于配置,您很可能没有可用于添加 ping 的服务器申请。

此外,我不推荐在 Web 应用程序中使用的东西,因为我发现当应用程序确实需要回收时,这些可能会导致问题...

最后一个想法

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

【讨论】:

  • +1 表示外部保持活动,另一个 +1(如果可以的话)建议将计时器代码移动到服务中。
  • +1 外部保持活动效果很好。您甚至可以编写自己的服务来运行服务器以保持网站的活力。
  • 将“空闲超时”设置为零以完全禁用回收。另请参阅:stackoverflow.com/questions/1596267/…
  • 我尝试将“空闲超时”设置为零,但这仍然导致我的应用程序在一天左右后关闭。
  • @ThomasLuijken 最终许多主机也设置了回收时间,我相信 1440 分钟是默认值。
【解决方案3】:

转到您的任务管理器并终止 w3wp.exe(或 aspnet_wp)。没有什么能阻止你这样做。归根结底,ASP.NET 应用程序不能假定连续的功能。

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

【讨论】:

    【解决方案4】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-07-10
      • 2018-06-28
      • 1970-01-01
      • 1970-01-01
      • 2011-06-29
      • 1970-01-01
      • 2017-12-02
      • 2023-03-07
      • 2015-03-01
      相关资源
      最近更新 更多