17

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

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

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

有什么建议么?这种事情一般是怎么做的?

4

4 回答 4

14

您不应该在您的 Web 应用程序中执行此任务,因为 Phil Haack 在his blog post.

这种事情一般是怎么做的?

您可以从 Windows 服务或什至使用 Windows 调度程序定期运行的控制台应用程序执行此任务。

于 2013-04-07T08:57:58.023 回答
3

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

于 2013-04-07T09:01:52.343 回答
2

几个选项:

  • 如果您将 Azure 作为网站托管,请查看最近发布的预览版 WebJobs ( http://azure.microsoft.com/en-us/documentation/articles/web-sites-create-web-jobs/ )
  • 如果您不想在网站之外提取电子邮件逻辑的痛苦,请在 url 处公开该功能(使用处理程序、mvc 操作等),然后运行按计划访问该 url 的 Windows 计划任务.
  • 编写一个简单的控制台应用程序,该应用程序通过 Windows 计划任务类似地执行。
  • 或者编写一个简单的 Windows 服务,它在内部循环并检查时间和到达时间,点击该 url,运行该 exe,或者有自己的代码向您发送电子邮件。
于 2014-07-02T01:32:25.803 回答
1

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

Quartz.NET - Enterprise Job Scheduler for .NET Platform

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

于 2013-04-07T11:30:35.073 回答