民间,
我们最近刚刚推出了一个调查应用程序,其MVC使用LINQ to entity。
我们有一个SurveyStatus表。
每个星期一我们都想运行一个自动查询来检查调查是否完整。如果调查完成,请发送电子邮件通知用户。
以前我们使用计划任务运行VB脚本链接到数据库。但是现在我们想在项目中创建这个EmailService来获取已经存在的模型和服务。
有人可以就实现这个目标的最佳途径给我一些建议吗?
提前致谢
答案 0 :(得分:1)
请查看Revalee开源项目。
Revalee是一项服务,允许您安排Web回调到ASP.NET MVC应用程序。 Revalee使用Windows服务管理任务持久性和调度,但利用您的ASP.NET MVC应用程序来处理处理工作(即"工作")。
以下是使用Revalee的MVC应用程序的工作流程:
Revalee Workflow http://revalee.sageanalytic.com/Images/workflow.png
在您的情况下,您将安排将来的回调(当用户提交调查时)以触发您的MVC应用程序中将检查您的调查结果的操作。然后,该检查的结果将触发(或不发送)后续电子邮件消息发送给用户。
<子> <强>&LT;编辑&gt; 强> 子>
要考虑的其他事情......
您可能希望更改处理问题域的方式。而不是安排固定任务&#34;每周一&#34; (即,执行一个同时测试所有调查的过程),翻转处理:单独处理每个调查。可以理解,如果没有像Revalee这样的回调解决方案,这是有问题的。但是使用Revalee,您可以安排每个用户的调查在提交后处理+48小时(例如)。这有两件事:
它改变了调查检查&#34;工作&#34;从测试所有调查到测试 调查 。
它在一周中的所有日子(以及一天中的几小时)展开检查处理。也就是说,它将不再局限于每个星期一正好比如早上8点钟处理。
要使用Revalee注册更个性化的回调,您可以注册将来的回调,如下所示:
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);
}
48小时后回调MVC应用程序时,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");
<子>&LT; /编辑&gt; 子>
我希望这会有所帮助。祝你好运!
免责声明:我是参与Revalee项目的开发人员之一。但需要明确的是,Revalee是免费的开源软件。源代码可在GitHub上找到。
答案 1 :(得分:0)
这里有很多选项,但由于这是一个MVC项目,所以你一定要查看MVC Mailer。
这有什么好处,你可以使用母版页作为电子邮件的布局,以及标准的MVC视图作为它的内容。这很容易接线,并且有一些很棒的文档和示例可以帮助您入门。
此外,如果您必须根据发送给他们的用户对电子邮件进行更改,您只需将这些参数添加到提供电子邮件视图的控制器方法中 - 现在您可以根据你在飞行中发送给谁。
除此之外,您只需要一台SMTP服务器来实际发送消息,这听起来就像您已经拥有的那样。
答案 2 :(得分:0)
我建议你使用FluentScheduler。
使用fluent界面配置计划的任务计划程序。用于从应用程序运行cron作业/自动化任务。
这样您就可以使用已经实现的方法。
using FluentScheduler;
public class MyRegistry : Registry
{
public MyRegistry()
{
// Schedule an ITask to run at an interval
Schedule<MyTask>().ToRunNow().AndEvery(2).Seconds();
// Schedule an ITask to run once, delayed by a specific time interval.
Schedule<MyTask>().ToRunOnceIn(5).Seconds();
// Schedule a simple task to run at a specific time
Schedule(() => Console.WriteLine("Timed Task - Will run every day at 9:15pm: " + DateTime.Now)).ToRunEvery(1).Days().At(21, 15);
// Schedule a more complex action to run immediately and on an monthly interval
Schedule(() =>
{
Console.WriteLine("Complex Action Task Starts: " + DateTime.Now);
Thread.Sleep(1000);
Console.WriteLine("Complex Action Task Ends: " + DateTime.Now);
}).ToRunNow().AndEvery(1).Months().OnTheFirst(DayOfWeek.Monday).At(3, 0);
//Schedule multiple tasks to be run in a single schedule
Schedule<MyTask>().AndThen<MyOtherTask>().ToRunNow().AndEvery(5).Minutes();
}
}
答案 3 :(得分:0)