在ASP.NET MVC网站中运行定时任务

7
我正在设计一个网站的架构,遇到了之前在ASP.NET中从未遇到过的问题。我想做的是每晚运行一次查询以检查数据库表中的实体的日期列,并根据日期执行X或Y动作。基本上,我想要在每晚调用一个函数。所有我搜索到的都将我引导到一些不同的方向,这些方向似乎对于这样一个简单操作来说过于复杂,或者更倾向于工作排队,而这并不是我想要的。
欢迎提出任何建议,只是寻找最简单的方法。谢谢!

2
糟糕的解决方案(不要使用):在控制器中创建一个操作来完成工作,然后在PowerShell中编写一个简单的get,通过任务计划程序运行脚本...但我不建议这样做,更好的解决方案是使用例如Quartz.net,它可以作为Windows服务运行。 - pwas
Sql Server有可以预定的任务。我建议在那里完成它。 - Scottie
1
你的应用程序托管在哪里?如果你使用Azure Web Apps(我强烈推荐),你可以轻松地将Web Job附加到你的应用程序上,并且可以很容易地按照给定的时间间隔进行调度运行。 - Jesse Carter
@JesseCarter 我们不使用Azure,我们自己托管服务器。 - Chiggins
@Chiggins 啊,真遗憾。 - Jesse Carter
1
可能是一个重复的问题,如何在MVC4 C#中安排任务? - Andreas Bergström
2个回答

11

我之前在一个项目中使用过Hangfire来做类似的事情。它非常棒,能够将所有代码保留在一个解决方案中(无需与Windows服务折腾),我强烈推荐。


7
我能想到三种不同的选择。
  1. 如果你所做的工作纯粹涉及数据库,大多数数据库平台如Microsoft SQL Server、Oracle等都有能力安排定期运行的作业。这些作业可以是SQL语句或存储过程。MS SQL Server还可以让您在存储过程中调用C#代码,这非常方便。

  2. 使用操作系统进行调度。Windows有Windows Scheduler作业(AT命令),Unix有cron作业。您可以安排一个可执行文件每晚运行,它会运行C#代码或SQL代码。

  3. 编写自己的调度服务。该服务将作为Windows服务一直运行,并在规律的时间间隔内执行某些代码。请查看调度框架,例如Quartz.net,它可以帮助组织一些调度细节。


我同意:一个Web服务器的工作是接收HTTP请求并返回HTTP响应。如果您想将其用作作业调度程序,可以找到一种狡猾的方法来实现,但是...您会做错事情。使用正确的工具来完成工作。ASP.NET MVC(以及在Web服务器上运行的所有内容)都不是适合此任务的工具。 - Gian Paolo
我正在做的大部分工作是想要检查一个名为finish_date的列,并查看它是否接近一年。一旦距离一年还有一周的时间,就会向所有者发送电子邮件,并说除非更新,否则将删除该列。然后在其“生日”当天将其删除。不确定您使用数据库的第一个建议是否适用于此,而且我也不太想使用Windows Scheduler。 - Chiggins
1
@Chiggins - 你可以在存储过程中实现所有这些功能。SQL Server可以使用sp_send_dbmail存储过程发送电子邮件。其余部分只是基本逻辑。然后使用代理程序进行调度。 - Mike Christensen

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