如何在ASP.NET MVC网站上执行定期工作?

时间:2013-04-07 05:03:10

标签: asp.net asp.net-mvc entity-framework

每天一次,我希望我的ASP.NET MVC4网站(可能在多台服务器上运行)通过电子邮件向我发送报告。这似乎是一件非常普遍的事情,但是我很难想出一个好方法。

由于几个原因,尝试在服务器上运行计时器来完成这项工作是有问题的。如果我有多台服务器,那么我可以在所有服务器上运行定时器(如果服务器出现故障);我需要在它们之间进行协调,这很复杂。此外,尝试通过实体框架从后台线程访问数据库增加了复杂性,我必须使用锁定策略来序列化周期性后台线程和"前景"之间的DbContext对象的构造/处置。控制器线程。

另一种选择是在服务器上运行计时器,但让计时器线程对生成并通过电子邮件发送报告的魔术页执行GET。这解决了DbContext问题,因为数据库访问发生在正常的Controller操作中,与所有其他Controller访问数据库序列化。但我仍然遇到可能运行多个计时器的问题,因此我需要在Controller操作中使用一些智能来忽略冗余报告请求。

有什么建议吗?这种事情通常是怎么做的?

4 个答案:

答案 0 :(得分:14)

您不应该从您的Web应用程序执行此任务,因为Phil Haack在his blog post中很好地解释了它。

  

这种事情通常如何完成?

您可以从Windows服务甚至是计划使用Windows计划程序定期运行的控制台应用程序执行此任务。

答案 1 :(得分:3)

正确的解决方案是创建一个独立于您的网站运行的后台服务。但是,如果这不是一个选项,那么您可以使用缓存,如Jeff Atwood在Easy Background Tasks in ASP.NET中所述。

答案 2 :(得分:2)

一些选择:

  • 如果您在Azure上作为网站托管,请查看最近在预览中发布的WebJobs(http://azure.microsoft.com/en-us/documentation/articles/web-sites-create-web-jobs/
  • 如果您不希望在网站外部提取电子邮件逻辑,请在网址上公开该功能(使用处理程序,mvc操作等),然后运行命中该网址的Windows计划任务按计划进行。
  • 编写一个简单的控制台应用程序,通过Windows计划任务执行类似的操作。
  • 或者编写一个简单的Windows服务,在内部循环并检查时间和到达时间,点击该URL,运行该exe,或者拥有自己的代码来向您发送电子邮件。

答案 3 :(得分:1)

我建议将Quartz.NET作为Windows服务运行:

Quartz.NET - Enterprise Job Scheduler for .NET Platform

下载中有Windows服务的样板代码。