已发布的Azure Timer Trigger Function未触发问题排查求助
Azure Timer Trigger函数未触发排查求助
我发布了一个采用Timer Trigger触发的Azure Function,定时器配置已被系统记录,但函数始终未被调用。我已经完成以下检查:
- 时区设置正确
- 定时器表达式配置无误
- 发布后已重启函数
- 触发器已同步
集成配置详情见截图。
我的函数代码如下:
[FunctionName("Function1")] public static void Run([TimerTrigger("0 15 21 * * *")]TimerInfo myTimer, ILogger log) { //log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}"); UpdateBuyData(); UpdateSellData(); } public static float GetDolarData(DateTime date, bool sell) { string url = "https://evds2.tcmb.gov.tr/service/evds/series=TP.DK.USD." + (sell ? "S" : "A") + "&startDate=" + date.ToString("dd-MM-yyyy") + "&endDate=" + date.ToString("dd-MM-yyyy") + "&type=xml&key=" + ApiKey; WebRequest webRequest = WebRequest.Create(url); webRequest.Method = "GET"; webRequest.ContentType = "application/xml;charset=UTF-8"; WebResponse response = webRequest.GetResponse(); System.IO.StreamReader sr = new System.IO.StreamReader(response.GetResponseStream(), System.Text.Encoding.UTF8); XmlReader reader = XmlReader.Create(sr); reader.ReadToFollowing("document"); reader.ReadToFollowing("items"); reader.ReadToFollowing("TP_DK_USD_" + (sell ? "S" : "A")); string dolarstr = reader.ReadElementContentAsString(); dolarstr = dolarstr.Replace(",", "."); float dolar = float.Parse(dolarstr); return dolar; } public static void UpdateSellData() { float dolar_try = GetDolarData(DateTime.Today.AddDays(-1), true); using (var conn = SqlClientFactory.Instance.CreateConnection()) { conn.ConnectionString = "Server=tcp:dolardatabaseserver.database.windows.net,1433;Initial Catalog=DolarDatabase;Persist Security Info=False;User ID=calculatoradmin;Password=Onur15975312*-;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;"; conn.Open(); using (var command = conn.CreateCommand()) { command.CommandText = "INSERT INTO DolarTRYS (Tarih, TP_DK_USD_S, UNIXTIME)VALUES (@Date, @DolarTRY, null)"; // Use parameters to prevent SQL injection command.Parameters.Add(new SqlParameter("@date", DateTime.Today.AddDays(-1).ToString("dd-MM-yyyy"))); command.Parameters.Add(new SqlParameter("@DolarTRY", dolar_try)); command.ExecuteNonQuery(); } } } public static void UpdateBuyData() { float dolar_try = GetDolarData(DateTime.Today.AddDays(-1), false); using (var conn = SqlClientFactory.Instance.CreateConnection()) { conn.ConnectionString = "Server=tcp:dolardatabaseserver.database.windows.net,1433;Initial Catalog=DolarDatabase;Persist Security Info=False;User ID=calculatoradmin;Password=Onur15975312*-;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;"; conn.Open(); using (var command = conn.CreateCommand()) { command.CommandText = "INSERT INTO DolarTRYA (Tarih, TP_DK_USD_A, UNIXTIME)VALUES (@Date, @DolarTRY, null)"; // Use parameters to prevent SQL injection command.Parameters.Add(new SqlParameter("@date", DateTime.Today.AddDays(-1).ToString("dd-MM-yyyy"))); command.Parameters.Add(new SqlParameter("@DolarTRY", dolar_try)); command.ExecuteNonQuery(); } } }
排查建议
启用日志输出:把代码中注释掉的
log.LogInformation行打开,发布后查看Application Insights或函数日志,确认函数是真的没触发,还是触发后执行报错没留下记录。查看触发器历史与运行状态:
- 在Azure门户中进入函数详情,查看“触发器历史记录”,哪怕触发失败也会有日志记录
- 确认函数应用处于运行状态,没有被手动停止或因资源限制被节流
验证定时器触发时间:
你用的表达式0 15 21 * * *是UTC时间21:15触发,结合你设置的时区,确认本地实际触发时间是否符合预期,比如土耳其时区是UTC+3,实际触发时间是本地次日00:15,别搞混时间点。补全异常捕获逻辑:
你的代码没有异常处理,一旦接口调用或数据库操作出错,函数会静默失败,看起来像没触发。给关键代码块加捕获并记录日志:try { UpdateBuyData(); UpdateSellData(); log.LogInformation("数据更新完成"); } catch (Exception ex) { log.LogError(ex, "数据更新失败"); }同时检查
ApiKey是否配置有效,数据库连接字符串的账号、密码是否正确,以及SQL防火墙是否允许函数应用访问。检查函数计划与配置:
- 如果是消耗计划,确认函数没有因长时间闲置休眠(Timer Trigger理论上会自动唤醒,但可以手动触发测试)
- 确认
WEBSITE_TIME_ZONE配置项是否正确设置(比如Turkey Standard Time),避免时区偏差导致触发时间不对
手动触发测试:
在Azure门户中手动触发函数,看是否能正常执行并写入数据,快速区分是定时器触发问题还是代码执行问题。
内容的提问来源于stack exchange,提问作者Berkay Onur
相关产品推荐
相关产品推荐

