0

我需要从我的 .NET 应用程序自动发送我的电子邮件。但是,在为将来安排作业时,作业仅在用户访问站点时执行。

全球.asax.cs

void Application_Start(object sender, EventArgs e)
{
    // Code that runs on application startup
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
    JobScheduler.Start();
}

作业调度程序 (ScheduledTasks.cs)

public class EmailJob : IJob
{
    public void Execute(IJobExecutionContext context)
    {
        BDL.Utilities.sendEmailNotification(to, subject, body);
    }
}

public static void start()
{
    foreach (AspNetUser user in users)
    {
        IJobDetail job = JobBuilder.Create<EmailJob>().WithIdentity((jobidentity))
            .UsingJobData("to", user.Email)
            .UsingJobData("subject", subject)
            .UsingJobData("body", bodyholder).Build();

        ITrigger trigger = TriggerBuilder.Create()
            // schedule for 1 day in the future
            .StartAt(expdate.AddDays(1)))
            .WithIdentity(triggerid)
            .Build();

        scheduler.ScheduleJob(job, trigger);
    }
}

我已经安排了未来 1 天的触发器。这个触发器应该会导致我的工作在未来 1 天执行。但是,由于某种原因,只有当用户在计划触发该作业的当天访问我的网站时,该作业才会执行。如何让 Quartz 自动执行这些作业???

编辑:我的目标是在不弄乱应用程序池线程的情况下完成此操作。接受的答案表明,这个问题仅仅是用自动化脚本替换用户交互。而副本要求一种方法来维护应用程序池线程,我可能会在 Java 中添加!

4

2 回答 2

0

+1 给@BRAHIMKamel。您可以考虑使用Hangfire在您的 ASP.NET 应用程序中进行一些工作处理。

但请注意,只要您依赖 IIS 应用程序池,您的作业就可以随时终止并重新启动。这意味着您的作业代码必须容忍多次后续执行。关于电子邮件,这意味着您应该在尝试实际发送消息之前检查您是否已经发送了您想要的内容。

于 2017-05-16T16:20:04.920 回答
0

我能够想出一个更优雅的解决方案。使用 Zapix 工具,我可以安排我的网站每 20 分钟进行一次质量检查。Zapix 只是访问了该站点并收到了 http 响应。通过使用 Zapix,它模仿了手动访问网站以触发电子邮件的功能。

于 2017-05-18T12:53:36.593 回答