【问题标题】:Is there a way to have code run on a time schedule in an ASP.NET web app?有没有办法让代码在 ASP.NET Web 应用程序中按时间安排运行?
【发布时间】:2012-07-03 05:56:39
【问题描述】:

我有一个 ASP.NET Web 应用程序提供对服务器上数据库的访问。我需要的是一种在给定时间表上在后台运行代码的方法,该时间表可以从另一个来源自动更新服务器数据库。

我知道如何在 Windows 应用程序中通过添加计时器、将函数链接到计时器滴答事件并启动计时器来执行此操作。我不知道如何在网络应用程序中执行此操作。

是否有针对 Web 应用程序的启动事件,或者无论用户在网站上做什么,我都可以启动此后台进程的地方?

【问题讨论】:

    标签: c# asp.net scheduled-tasks


    【解决方案1】:

    您不应该在 ASP.NET 网站中执行此操作 - 这是一个主要的禁忌。您认为在后台 .exe 上使用计时器是正确的。您应该考虑创建 Windows 任务(由服务器任务计时器执行的控制台 .exe)或 Windows 服务。我建议使用 Windows 服务,因为这是标准做法。

    【讨论】:

    • 好主意,但如果用户无法访问托管网站的计算机,正如@aquinas 已经指出的那样?
    • @walther -- 想一想解决这个问题会有点容易。由于用户可以创建网站/网络服务,他应该创建一个页面 (.aspx) 或网络服务 (.aspx / .svc) 来处理来自他有权访问的服务器的请求。 Windows 服务或任务可以引用该页面或服务并发送请求以“完成数据库中所需的工作”。我会建议一个网络服务。
    【解决方案2】:

    如果您可以访问托管您网站的计算机,我会编写一个从任务计划程序运行的小应用程序。

    Web 服务器不适合处理长时间运行的后台任务。这是错误的工具。

    如果您无法访问托管计算机,那么我建议您构建某种界面,让另一台计算机重建数据库并上传它。我在最宽松、最广泛的意义上使用术语“接口”和“上传” - 应用您自己的定义。

    【讨论】:

    • 太糟糕了,我只能投票一次。 “错误的工具”正是问题所在。
    • 如果他没有访问托管网站的计算机怎么办?
    • @aquinas 请在我的回答中查看我对 walther 的回复。
    【解决方案3】:

    几个月前我自己也在寻找解决方案,尽管到目前为止我还没有足够的时间尝试它,但我想我可以与你分享链接。也许你会发现它很有帮助。

    如果是,请在这里告诉我。

    http://quartznet.sourceforge.net/

    How to use Quartz.net with ASP.NET

    【讨论】:

      【解决方案4】:

      您可以使用 Windows 服务或使用 Timer Control(在 Ajax 类别中)

      或者

      【讨论】:

        【解决方案5】:

        正如其他答案所述,执行此完整功能 - 更新数据库并将其安排为 ASP.NET 应用程序使用了错误的工具来完成这项工作。

        ASP.NET 可用于更新数据库 - 这是完全有效的。它发生故障的地方是计时器。 ASP.NET 应用程序并不意味着长时间运行,这是计时器工作所必需的。

        如果你能做到,我强烈建议使用其他人建议的方法 - Windows 服务或计划任务。

        但是,如果除了发布 ASP.NET 代码之外,您无权访问实际服务器 - 您无法安装服务,也无法设置 Windows 应用程序以按计划运行,这里有一个开箱即用的想法。


        设置执行更新的 Web 服务或 ASPX 页面,然后从您控制的机器上的计划任务中调用该页面。

        因此,如果它位于 http://www.someserver.net/updatedb.aspx,那么您没有理由不能在自己的 PC 上设置计划任务来调用该 URL。

        我认为这是最后的解决方案,仅当您无法执行其他选项之一时才使用。

        【讨论】:

        • 让我们更加更多:使用带有回调函数的asp.net缓存。你不必在这个缓存中存储任何重要的东西,你只是将它用于 asp.net 中内置的计时功能。在您的回调函数中,您调用: new WebClient().DownloadString(theUrlOfYourUpdatingPage);是的。这是正确的。让网站调用自身。这样 IIS 就永远无法卸载您的应用程序池。 that 在盒子外面怎么样? :)
        【解决方案6】:

        global.asax.cs 文件有一个在您的应用程序启动时触发的方法:Application_Start。您可以在该事件中连接您的计时器方法。请注意,根据 IIS 的配置方式,您的应用程序池可能会关闭。例如,如果没有人在 20 分钟内点击该站点。只需确保您必须每 X 分钟运行一次,并且将 IIS 配置为始终运行并启动您的应用程序。这比听起来要难。最后,您可能希望使用常规的 Windows 计划任务。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-08-17
          • 2022-01-13
          • 1970-01-01
          • 2010-09-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-21
          相关资源
          最近更新 更多