【问题标题】:Need job scheduler in asp.net在 asp.net 中需要作业调度程序
【发布时间】:2010-10-21 08:17:18
【问题描述】:

我们有一个网站,我们需要一个调度程序在特定时间接收通知(电子邮件)。例如。一个人在下午 5 点设置提醒以在下午 4:45 参加会议,将在下午 4:45 收到大致相同的电子邮件。

由于此站点托管在共享服务器上,我们无法控制服务器来运行任何 SQL 作业或调度程序应用程序。

在这种情况下,asp.net 中有什么可以提供帮助的吗?

【问题讨论】:

    标签: asp.net sql-server job-scheduling


    【解决方案1】:

    我不相信你,因为来源 Quartz.Net 代码(1.0 和 1.0.1) 不能在 Visual 下编译 Studio.Net 2005 和 2008。唯一的方法 获得 Quartz.Net 就是使用整个 Spring.Net 包,它编译 在 VS.Net 2005 和 2008 下很好

    除非您可以分享一些提示,否则如何 编译和使用quartz.dll asp.net 项目! (网页的 Quartz.Net 和 readme.txt 没有 提供有关来源的任何信息 coude 编译)每个提示都是 欢迎!

    一开始我也遇到了麻烦,但这是因为必要的 AsemblyInfo.cs 包含在父文件夹中。此外,您还需要添加其中包含的三个 DLL。

    【讨论】:

      【解决方案2】:

      我不相信你,因为 Quartz.Net(1.0 和 1.0.1)的源代码不能在 Visual Studio.Net 2005 和 2008 下编译。获得 Quartz.Net 的唯一方法是使用整个 Spring .Net 包,在 VS.Net 2005 和 2008 下编译良好​​p>

      除非你能分享一些技巧,否则如何在 asp.net 项目中编译和使用quartz.dll! (Quartz.Net 和 readme.txt 的网页没有提供任何关于源代码编译的信息)欢迎每个提示!

      【讨论】:

        【解决方案3】:

        我遇到了和你一样的问题,最后我编写了一个使用 Quartz.NET 的服务:http://quartznet.sourceforge.net/ 并连接到与网站相同的数据库。

        【讨论】:

          【解决方案4】:

          您需要在服务器上完成一项工作,但您没有从 ASP.NET 触发它的好方法?

          如何创建一个网页来启动您的工作,并在请求该页面的其他地方(即另一台计算机)运行计时器。 (只需点击页面即可触发您的工作)

          【讨论】:

          • +1 IMO,这是最简单、最可靠的方法。
          • 好吧,如果你可以有一个计时器,为什么不让计时器只运行你的代码,而不是让其他机器上运行一些请求网页的东西呢?您将网络通信和第二台机器添加到您的工作流程中,这意味着额外的潜在故障点。这意味着不太可靠。
          • @joel 穆尔。取点。但是对于“为什么不在您的代码中运行计时器”,请参阅 Peter Lillevolds 回答的第一部分...
          • Peter Lillevold 回答的第一部分是为什么您不应该将与在 ASP.NET 中显示网页无关的代码嵌入。我同意他关于 Windows 服务的建议 - 正如 Bård 建议的那样,我在我的中使用 Quartz.NET。
          • 伙计们,别忘了 ASP.Net 也意味着 Web 服务。在 ASP.Net 应用程序中调用 Web 服务的某个地方运行计时器并没有错。
          【解决方案5】:

          这确实是不可取的,但你可以按照 Razzie 的建议去做。我已经看过很多次了。虽然丑陋,但有时你只需要做丑陋的黑客。

          不过,使用这种方法,您必须确保您的应用程序没有被卸载。所以你需要某种方式来维持生命。我建议设置一个 Web 监控工具,该工具将不断拉出一个页面 (aspx) 以保持应用程序处于活动状态。这些家伙是免费的http://mon.itor.us/

          【讨论】:

          • 我认为按照@Arjan Einbu 的建议去做会更好。像mon.itor.us 这样的东西看起来是一种非常简单的方法来设置必要的外部页面请求。
          • 那么你的应用程序依赖于另一台机器必须运行并且你必须记住它;)我会忘记或者机器会由于更新等而重启......你做什么它......这些都是丑陋的黑客;)
          【解决方案6】:

          这个怎么样:Simulate a Windows Service using ASP.NET to run scheduled jobs

          在某一时刻,这种技术是used on Stack Overflow,尽管我认为它不再是了。

          老实说,这对我来说似乎是一个令人讨厌的、容易出错的 hack,但如果您无法在服务器上运行除您的网站之外的任何东西,那么这样的东西可能是您唯一的选择。

          【讨论】:

          • 100% 同意该方法的分析。但是,只要您了解其中的限制(即:“计划的”作业可能无法准确地按计划运行),那么它可能是一个很好的解决方案。
          【解决方案7】:

          但是,如果您真的完全陷入困境并且别无选择,只能将其托管在您的 WebApp 中,

          您可以查看在 Global.asax.cs 文件中创建 System.Timers.Timer 实例。像往常一样连接一个 Elapsed 事件,并给它一些代码来做一些类似的事情

          protected void myTimer_Elapsed(object sender, EventArgs e)
          {
              if(System.DateTime.Now Falls in Some Configured Time-Window)
                  //Do Stuff
          }
          

          但正如有人指出的那样,它不能保证,因为 IIS 可能会在此期间重置, 在这种情况下你会错过它。

          【讨论】:

            【解决方案8】:

            如果您真的无法控制服务器(也就是说,您不能使用 sql 作业、计划任务或安装 Windows 服务器),那么您可以使用在 Global.asax 中初始化的 System.Threading.Timer(例如,在应用程序启动时)每 x 分钟调用一次应用程序中的某个方法。然后,此方法将查询您的数据库并查看需要发送哪些通知。

            不过,这确实不是一个理想的方法,因为据我所知,定时器并不能保证总是调用,因为就像 Peter 所说的那样,不能保证您的 Web 应用程序始终处于活动状态。

            但是,根据您的要求,如果您没有其他选择,这仍然是一种“足够好”的方法。

            【讨论】:

              【解决方案9】:

              使用 ASP.NET,您无法保证您的应用始终处于活动状态,因此将 Web 应用作为调度解决方案的主机进程在 IMO 中是不可行的。

              此方案需要 Windows 服务。您可以完全控制启动和停止进程以及监控应用程序的方式。

              你能在不同的机器上托管这样的服务吗?即使 Web 应用程序在托管服务器上运行并不意味着您必须在同一台服务器上运行调度程序。

              【讨论】:

              • 此外,Windows 服务可以简单地调用您托管站点上的 Web 服务来启动任务,进一步简化事情。
              猜你喜欢
              • 1970-01-01
              • 2011-08-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-07-23
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多