c# - Visual Studio 2013 中 MVC 项目中的自动电子邮件

标签 c# asp.net-mvc scheduled-tasks scheduler

<分区>

各位,

我们最近刚刚推出了一个调查应用程序,它的 MVC 使用 LINQ to entity。

我们有一个 SurveyStatus 表。

每个星期一我们都想运行一个自动查询来检查调查是否完成。如果调查完成,则发送电子邮件通知用户。

之前,我们使用计划任务完成此操作,该任务运行 VB 脚本以链接到数据库。但是现在我们想在项目中创建这个 EmailService 以利用已经存在的模型和服务。

谁能给我一些实现此目标的最佳方法的建议?

提前致谢

最佳答案

请看Revalee开源项目。

Revalee 是一项服务,可让您安排对 ASP.NET MVC 应用程序的网络回调。 Revalee 使用 Windows 服务管理任务持久性和调度,但利用您的 ASP.NET MVC 应用程序来处理处理工作(即“工作”)。

以下是使用 Revalee 的 MVC 应用程序的工作流程:

Revalee Workflow
(来源:sageanalytic.com)

在您的情况下,您将安排一个 future 的回调(当用户提交调查时)以在您的 MVC 应用程序中触发一个操作来检查您的调查结果。该检查的结果将触发(或不触发)后续电子邮件消息发送给用户。

其他需要考虑的事情......

您可能想要改变处理问题域的方式。不要“每周一”安排固定任务(即执行同时测试所有调查的过程),而是翻转处理:单独处理每个调查。可以理解,如果没有像 Revalee 这样的回调解决方案,这是有问题的。但是使用 Revalee,您可以安排每个用户的调查在他们提交调查后 48 小时(例如)进行处理。这做了两件事:

  1. 它将调查检查“工作”从测试所有调查更改为测试一项调查

  2. 它将检查处理分散到一周中的所有天(和一天中的几个小时)。也就是说,它将不再仅限于每周一早上 8 点整处理。

要使用 Revalee 注册一个更个性化的回调,您可以像这样注册一个 future 的回调:

private void ScheduleSurveyInspection(int surveyId)
{
    // The callback will be 48 hours from now
    DateTimeOffset callbackTime = DateTimeOffset.Now.AddHours(48.0);

    // The callback URL will include the ID of the survey to be reviewed
    Uri callbackUrl = new Uri(
            string.Format(
                    "http://mywebapp.com/Survey/Inspect/{0}",
                    surveyId
                )
        );
    
    // Register the callback request with the Revalee service
    RevaleeRegistrar.ScheduleCallback(callbackTime, callbackUrl);
}

当您的 MVC 应用程序在 48 小时后回调时,您的 SurveyController 将使用以下 Inspect 操作处理回调:

[AllowAnonymous]
[CallbackAction]
public ActionResult Inspect(int surveyId)
{
    // TODO Lookup the survey's information and perform the necessary review
    // ...
    return new EmptyResult();
}

当然,如果您当前的处理工作流程不能从每周一每周一次更改为调查提交后 +48 小时发生,那么 Revalee 仍可用于安排该任务。您的 callbackUrl 将只是:

Uri callbackUrl = new Uri("http://mywebapp.com/Survey/InspectAll");

希望对您有所帮助。祝你好运!

免责声明:我是参与 Revalee 项目的开发人员之一。不过需要明确的是,Revalee 是免费的开源软件。源代码可在 GitHub 上获得.

关于c# - Visual Studio 2013 中 MVC 项目中的自动电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24557085/

相关文章:

html - 允许在我的登录表单 MVC 上访问我的 Site.Css

c# - 注册表 - NetworkList 配置文件 - 无法通过程序访问

c# - 垃圾回收,我们应该依赖它吗?

c# - 如何使用 MongoDB 部署 C# .net 应用程序

jquery - 输入类型按钮/提交同时进行表单验证并通过 jquery ajax 提交?

c# - 实体对象的使用

powershell 测试路径未被识别为 cmdlet

java - 我们可以创建一个 Spring ScheduledExecutorTask 池吗?

WIX 创建计划任务

c# - WPF:带有重置项的组合框