如何使用asp.net mvc中的Windows服务自动发送邮件

时间:2011-07-06 17:30:06

标签: asp.net asp.net-mvc windows windows-services

在我的项目中,我使用了时间表控制。它可以修复单个/多个用户的约会。我已配置通过保存/编辑约会操作向所选用户发送邮件。

现在我需要在预约时间内每隔30分钟自动向所选用户发送邮件。例如如果在下午2点到4点之间预约用户,则需要在下午2点到下午4点之间每30分钟发送一次邮件。

我已经安装了Windows服务。但我不知道如何将我的MVC Web项目与Windows服务连接起来。我在我的网站项目中使用MDF数据库。我不知道如何在窗口服务中处理这些数据。

请给我一些建议。我对MVC和Windows服务都很陌生。

提前致谢。

3 个答案:

答案 0 :(得分:2)

您的问题中列出的问题听起来好像是对Revalee开源项目的使用。

Revalee是一项服务,允许您安排Web回调到ASP.NET MVC应用程序。 Revalee使用Windows服务管理任务持久性和调度,但利用您的ASP.NET MVC应用程序来处理处理工作(即“工作”)。在您的情况下,当Revalee回调MVC应用程序时,您将使用MVC应用程序向用户发送自动电子邮件消息。

以下显示了使用Revalee的MVC应用程序使用的工作流程概述:

Revalee Workflow http://revalee.sageanalytic.com/Images/workflow.png

预约时,您的应用程序会向Revalee注册回调操作。这将包括一个日期&是时候调用MVC应用程序以及调用的URL。因此,要向Revalee注册回调,您可以在MVC应用程序中包含以下方法。

private void ScheduleAppointmentReminderEmail(int appointmentId)
{
    // The DetermineAppointmentReminderTime() method is your private method
    // which returns an appointment's next reminder time as a DateTimeOffset.
    DateTimeOffset callbackTime = DetermineAppointmentReminderTime(appointmentId);

    // The callback should at the task's end time
    Uri callbackUrl = new Uri(
            string.Format(
                    "http://mywebapp.com/Email/SendAppointmentEmail/{0}",
                    appointmentId
                )
        );

    // Register the callback request with the Revalee service
    RevaleeRegistrar.ScheduleCallback(callbackTime, callbackUrl);
}

当您的MVC应用程序收到回调时,SendAppointmentEmail操作可能如下所示:

[AllowAnonymous]
[CallbackAction]
public ActionResult SendAppointmentEmail(int appointmentId)
{
    // TODO   1. Validate the appointmentId,
    //        2. Lookup the appointment's information, &
    //        3. Send the email message
    // ...

    return new EmptyResult();
}

Revalee网站提供了完整的API参考以及有关如何安装和配置Windows服务的说明。该服务易于部署和使用。 Chocolatey处的安装,而准备在Visual Studio中使用的MVC客户端库可在NuGet获得。 (也有non-MVC client libraries。)当然,作为一个开源项目,Revalee的完整源代码可以在GitHub上找到。

最后,如果上面不清楚,Revalee服务不是外部第三方在线调度程序服务,而是在您自己的网络上安装完全控制的Windows服务。它驻留在您自己选择的Windows服务器上并在其上运行,它可以从ASP.NET MVC应用程序接收回调注册请求。

我希望这会有所帮助。好运!

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

答案 1 :(得分:1)

我不太了解您的问题,但是,Web应用程序和Windows服务之间的连接点是数据库。您的Web应用程序在数据库中写入挂起的约会。然后,您的Windows服务每隔30分钟检查一次,例如,是否有任何待处理的约会必须发送电子邮件。如果它发现它必须发送一些电子邮件,它会发送它们并将Db中的条目标记为已完成(意味着它已发送通知)。你也可以像我提到的那样使用Quartz.net in another answer,但Windows服务也是一个很好的解决方案。

答案 2 :(得分:0)

您不必使用Windows服务。您描述的所有内容都可以通过使用内置的HttpModule(即Global.asax)来解决。

高级概念是让HttpApplication保持运行,并在应用程序的生命周期内运行,这是部署到IIS的MVC Web应用程序。这是为了防止Application_End在20分钟时因默认不活动而触发。

保持应用程序运行后,您可以安排首选时间间隔与数据库通信并发送电子邮件。这将是完成任务的最简单方法。

有一个codeproject示例:http://www.codeproject.com/KB/aspnet/ASPNETService.aspx