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

Bob*_*lth 17 asp.net asp.net-mvc entity-framework

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

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

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

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

Dar*_*rov 14

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

这种事情通常怎么做?

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

  • 如果您没有权限在服务器上设置计划任务,您可以使用IPPatrol等第三方服务每天定期向您的网站发出HTTP请求. (2认同)