我尝试创建一个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方法
提前致谢
答案 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将起作用。