Azure C#Webjob TimeTrigger未触发

时间:2017-05-20 11:58:05

标签: c# azure timer webjob

我尝试创建一个Azure WebJob,它将在set计时器上执行Functions.Methods。我在VS2017中设置了一个简单的WebJob项目,并添加了Microsoft.Azure.Webjobs.Extensions以允许我引用Timers。

作为一个学习过程,我试图创建一个WebJob,当TimerTrigger触发时,它会调用一个函数方法向我的地址发送一封电子邮件(例如每隔60秒发送一封电子邮件)

My Main void看起来像这样:

public static void Main()
    {
        var config = new JobHostConfiguration();

        config.Tracing.ConsoleLevel = System.Diagnostics.TraceLevel.Verbose;


        config.UseTimers();

        var host = new JobHost();
        host.RunAndBlock();
    }

我想调用的函数方法如下所示:

    [NoAutomaticTrigger]    //See below note on [NoAutomaticTrigger]
    public static void SendMail([TimerTrigger("00:00:10", RunOnStartup = true)] TextWriter log)
    {
        log.WriteLine("[" + DateTime.Now.ToString() + "] Preparing to send Mail");
        MailMessage Message = new MailMessage();
        SmtpClient MailClient = new SmtpClient();

        String FromAddress = "****";
        String FromName = "****";
        String Password = "****;
        String ToAddress = "****";

        MailClient.UseDefaultCredentials = false;
        MailClient.Credentials = new System.Net.NetworkCredential(FromAddress, Password);
        MailClient.Port = 587;
        MailClient.Host = "****";
        MailClient.DeliveryMethod = SmtpDeliveryMethod.Network;
        MailClient.EnableSsl = true;



        Message.To.Add(ToAddress);
        Message.From = new MailAddress(FromAddress, FromName);
        Message.Subject = "WebJob | Test Mail";
        Message.Body = "TimerTrigger Function Sendmail triggered at: " + DateTime.Now.ToString();
        MailClient.Send(Message);
        log.WriteLine("[" + DateTime.Now.ToString() + "] Mail Successfully Sent");
    }

现在,如果我在本地调试上面的内容,我会看到this

SendMail方法永远不会触发。

现在,如果我将此作为WebJob上传到azure,则导航到WebJob仪表板/功能/功能调用日志和"运行功能"我从My SendMail方法后不久收到一封电子邮件,其中包含以下输出:

  

[5/20/2017 11:47:31 AM]准备发送邮件

     

[5/20/2017 11:47:32 AM]邮件已成功发送

RE:[NoAutomaticTrigger]

我有一个建议是从SendMail方法中删除[NoAutomaticTrigger]属性,因为这会告诉jobhost忽略计时器,但如果我这样做,我得到:

  

找不到工作职能。尝试公开您的工作类和方法。如果您正在使用绑定扩展(例如ServiceBus,Timers等),请确保您已在启动代码中调用扩展的注册方法(例如config.UseServiceBus(),config.UseTimers ()等。)。

所以问题是,当在Azure中作为WebJob运行时,如何在指定的[TimerTrigger]上触发我的sendmail方法

提前致谢

1 个答案:

答案 0 :(得分:1)

  

所以问题是,当在Azure中作为WebJob运行时,如何在指定的[TimerTrigger]上触发我的sendmail方法

根据您的代码,我发现您错过了将config参数传递给JobHost。

var host = new JobHost(config);

此外,确实需要删除NoAutomaticTrigger属性,并且应将TimerTrigger属性应用于类型为TimerInfo的参数。以下代码供您参考。

public static void SendMail([TimerTrigger("00:00:10")] TimerInfo timer, TextWriter log)

之后,TimerTrigger将起作用。

enter image description here