在我的项目中,我使用了时间表控制。它可以修复单个/多个用户的约会。我已配置通过保存/编辑约会操作向所选用户发送邮件。
现在我需要在预约时间内每隔30分钟自动向所选用户发送邮件。例如如果在下午2点到4点之间预约用户,则需要在下午2点到下午4点之间每30分钟发送一次邮件。
我已经安装了Windows服务。但我不知道如何将我的MVC Web项目与Windows服务连接起来。我在我的网站项目中使用MDF数据库。我不知道如何在窗口服务中处理这些数据。
请给我一些建议。我对MVC和Windows服务都很陌生。
提前致谢。
答案 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