需要在ASP.NET中使用作业调度程序。

6

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

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

在asp.net中是否有任何东西可以帮助解决这个问题?

9个回答

9

完全同意该方法的分析。然而,只要您在开始时了解限制(即:“计划”的作业可能不会按计划运行),那么它可能是一个不错的解决方案。 - NotMe

4

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

那么创建一个网页来启动你的任务,然后在其他地方(例如另一台电脑)运行一个定时器,请求该页面即可触发你的任务。(只需访问该页面即可触发任务)


1
在我看来,这是最简单、最可靠的完成此任务的方法。+1 - codeape
如果你可以设置一个计时器,为什么不让计时器直接运行你的代码,而不是在另一台机器上请求网页?这样会增加网络通信和第二台机器到你的工作流程中,这意味着额外的潜在故障点。这也意味着更不可靠。 - Joel Mueller
1
@joel mull。收到。但是关于“为什么不让计时器在您的代码中运行”,请参见Peter Lillevolds答案的第一部分... - Arjan Einbu
Peter Lillevold的回答的第一部分是为什么你不应该将与显示网页无关的代码嵌入到ASP.NET中。我同意他建议使用Windows服务 - 我在我的项目中使用Quartz.NET,就像Bård建议的那样。 - Joel Mueller
各位,不要忘记 ASP.Net 也意味着 Web 服务。在 ASP.Net 应用程序中运行某个定时器调用 Web 服务是没有问题的。 - Peter Lillevold

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

2
使用ASP.NET并不能保证您的应用程序始终处于活动状态,因此作为调度解决方案的Web应用程序主机进程不可行(在我看来)。对于这种情况,您需要使用Windows服务。您可以完全控制启动和停止过程以及监视应用程序的方式。您能否在不同的机器上托管这样的服务?即使Web应用程序在托管服务器上运行,也不意味着您必须在同一服务器上运行调度程序。

此外,Windows 服务可以直接调用您托管站点上的 Web 服务来启动任务,进一步简化事务。 - Robert Paulson

1

然而,如果你真的完全卡住了,没有选择,只能在你的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在此期间不会重置,如果发生重置,则会错过它。

1
如果您真的无法控制服务器(意味着您无法使用 SQL 作业、计划任务或安装 Windows 服务器),那么您可以使用在 Global.asax 中初始化 System.Threading.Timer 的方法(例如,在应用程序启动时)调用应用程序中的特定方法来每 x 分钟查询数据库并查看哪些通知需要发送。
然而,这确实不是理想的方法,因为据我所知,定时器不能保证总是被调用,因为像 Peter 说的那样,您的 Web 应用程序不能保证始终处于活动状态。
但是,根据您的要求,如果没有其他选择,它仍然可以是一种足够好的方法。

0
我不相信你,因为Quartz.Net(1.0和1.0.1)的源代码在Visual Studio.Net 2005和2008下无法编译。获取Quartz.Net的唯一方法是使用整个Spring.Net包,在VS.Net 2005和2008下编译良好。
除非您能分享一些提示,如何在asp.net项目中编译和使用quartz.dll!(Quartz.Net的网页和readme.txt没有提供有关源代码编译的任何信息)欢迎每一个提示!
我起初也遇到了麻烦,但这是因为必要的AsemblyInfo.cs包含在父文件夹中。此外,您需要添加三个包含的DLL。

0

这并不是一个理想的做法,但你可以像Razzie建议的那样去做。我已经看到过很多次了。虽然很丑陋,但有时候你只能使用这些丑陋的hack。

使用这种方法,你必须确保你的应用程序没有被卸载。所以你需要一些保持活跃的方式。我建议设置一个网络监控工具,它将不断地拉取一个页面(aspx)来保持应用程序的活跃状态。这些工具是免费的 http://mon.itor.us/


1
我认为最好按照@Arjan Einbu的建议去做。像http://mon.itor.us这样的网站看起来是设置必要的外部页面请求的非常简单的方法。 - codeape
那么你的应用程序就有一个依赖关系,需要另一台机器运行,并且你必须记住它 ;) 我会忘记或者由于更新等原因机器会重新启动.. 无论如何,这些都是丑陋的hack ;) - Chad Grant

-1

我不相信你,因为Quartz.Net(1.0和1.0.1)的源代码在Visual Studio.Net 2005和2008下无法编译。获取Quartz.Net的唯一方法是使用整个Spring.Net包,在VS.Net 2005和2008下编译正常。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接