每天一次,我希望我的可能在多个服务器上运行的 ASP.NET MVC4 网站通过电子邮件将报告发送给我。这似乎是一件很常见的事情,但我很难想出一个好方法来做到这一点。
由于几个原因,尝试在服务器上运行计时器来完成这项工作是有问题的。如果我有多个服务器,那么我会在所有服务器上运行计时器(以防服务器出现故障);我需要在它们之间进行协调,这变得很复杂。此外,尝试从后台线程通过实体框架访问数据库会增加复杂性,即我必须采用锁定策略来序列化周期性后台线程和“前台”控制器线程之间的 DbContext 对象的构造/处置。
另一种选择是在服务器上运行计时器,但让计时器线程对生成并通过电子邮件发送报告的魔术页面执行 GET。这解决了 DbContext 问题,因为数据库访问发生在正常的 Controller 操作中,与所有其他 Controller 对数据库的访问一起序列化。但是我仍然遇到可能运行多个计时器的问题,因此我需要在 Controller 操作中使用一些技巧来忽略多余的报告请求。
有什么建议么?这种事情一般是怎么做的?