You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

已发布的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();
        }
    }

}

排查建议

  1. 启用日志输出:把代码中注释掉的log.LogInformation行打开,发布后查看Application Insights或函数日志,确认函数是真的没触发,还是触发后执行报错没留下记录。

  2. 查看触发器历史与运行状态:

    • 在Azure门户中进入函数详情,查看“触发器历史记录”,哪怕触发失败也会有日志记录
    • 确认函数应用处于运行状态,没有被手动停止或因资源限制被节流
  3. 验证定时器触发时间:
    你用的表达式0 15 21 * * *是UTC时间21:15触发,结合你设置的时区,确认本地实际触发时间是否符合预期,比如土耳其时区是UTC+3,实际触发时间是本地次日00:15,别搞混时间点。

  4. 补全异常捕获逻辑:
    你的代码没有异常处理,一旦接口调用或数据库操作出错,函数会静默失败,看起来像没触发。给关键代码块加捕获并记录日志:

    try
    {
        UpdateBuyData();
        UpdateSellData();
        log.LogInformation("数据更新完成");
    }
    catch (Exception ex)
    {
        log.LogError(ex, "数据更新失败");
    }
    

    同时检查ApiKey是否配置有效,数据库连接字符串的账号、密码是否正确,以及SQL防火墙是否允许函数应用访问。

  5. 检查函数计划与配置:

    • 如果是消耗计划,确认函数没有因长时间闲置休眠(Timer Trigger理论上会自动唤醒,但可以手动触发测试)
    • 确认WEBSITE_TIME_ZONE配置项是否正确设置(比如Turkey Standard Time),避免时区偏差导致触发时间不对
  6. 手动触发测试:
    在Azure门户中手动触发函数,看是否能正常执行并写入数据,快速区分是定时器触发问题还是代码执行问题。


内容的提问来源于stack exchange,提问作者Berkay Onur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 04:07:32