每天一次,我希望我的ASP.NET MVC4网站(可能在多台服务器上运行)通过电子邮件向我发送报告。这似乎是一件非常普遍的事情,但是我很难想出一个好方法。
由于几个原因,尝试在服务器上运行计时器来完成这项工作是有问题的。如果我有多台服务器,那么我可以在所有服务器上运行定时器(如果服务器出现故障);我需要在它们之间进行协调,这很复杂。此外,尝试通过实体框架从后台线程访问数据库增加了复杂性,我必须使用锁定策略来序列化周期性后台线程和"前景"之间的DbContext对象的构造/处置。控制器线程。
另一种选择是在服务器上运行计时器,但让计时器线程对生成并通过电子邮件发送报告的魔术页执行GET。这解决了DbContext问题,因为数据库访问发生在正常的Controller操作中,与所有其他Controller访问数据库序列化。但我仍然遇到可能运行多个计时器的问题,因此我需要在Controller操作中使用一些智能来忽略冗余报告请求。
有什么建议吗?这种事情通常是怎么做的?
答案 0 :(得分:14)
您不应该从您的Web应用程序执行此任务,因为Phil Haack在his blog post
中很好地解释了它。
这种事情通常如何完成?
您可以从Windows服务甚至是计划使用Windows计划程序定期运行的控制台应用程序执行此任务。
答案 1 :(得分:3)
正确的解决方案是创建一个独立于您的网站运行的后台服务。但是,如果这不是一个选项,那么您可以使用缓存,如Jeff Atwood在Easy Background Tasks in ASP.NET中所述。
答案 2 :(得分:2)
一些选择:
答案 3 :(得分:1)
我建议将Quartz.NET作为Windows服务运行:
Quartz.NET - Enterprise Job Scheduler for .NET Platform
下载中有Windows服务的样板代码。