Azure Function应用:部署后不会触发TimerTrigger

时间:2019-12-25 07:09:49

标签: c# .net azure azure-functions

我有一个通过TimerTrigger(美国东部标准时间每天午夜)运行的Azure功能应用程序(v2)。当我在Visual Studio中本地运行它时,它工作正常。但是,当我使用内置的Visual Studio发布工具将其直接发布到Function App(Zip Deploy)时,它不会在午夜或任何时候触发。

我也尝试过直接通过Azure门户运行该功能,但这也不起作用。这是我的代码。它要做的就是从Azure存储中提取文件,更新排名游戏JSON,然后将文件替换回Azure存储中。我有一个移动应用,可以拉ranked_settings.json并生成排名游戏。

[FunctionName("RankedSettingsIntervalFunction")]
public static void Run([TimerTrigger("0 0 0 */1 * *")]TimerInfo myTimer, ILogger log, ExecutionContext context)
{
    Console.WriteLine("App started running at " + DateTimeOffset.UtcNow.ToString());

    const string fileName = "ranked_settings.json";

    var config = new ConfigurationBuilder()
                .SetBasePath(context.FunctionAppDirectory)
                .AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
                .AddEnvironmentVariables()
                .Build();

    var conn1 = config["FileStorage:ConnectionStringOne"];
    var conn2 = config["FileStorage:ConnectionStringTwo"];

    StorageService service = new StorageService(conn1, conn2);
    Settings settings = RankedSettingsGenerator.Generate();
    var json = JsonConvert.SerializeObject(settings);

    Console.WriteLine("App original JSON created at " + DateTimeOffset.UtcNow.ToString());
    Console.WriteLine(json);

    byte[] byteArray = Encoding.ASCII.GetBytes(json);
    MemoryStream stream = new MemoryStream(byteArray);

    service.AddFile(fileName, stream);

    Console.WriteLine("App finished running at " + DateTimeOffset.UtcNow.ToString());
}

我的function.json文件具有以下绑定:

"bindings": [
    {
      "type": "timerTrigger",
      "schedule": "0 0 0 */1 * *",
      "useMonitor": true,
      "runOnStartup": false,
      "name": "myTimer"
    }
  ],

我当时想的问题是runOnStartup属性为false,但这并不能解释为什么当我按下门户中的Run按钮时,该属性不起作用。

3 个答案:

答案 0 :(得分:1)

更新

根据您的情况,请注意Azure上没有local.settings.json文件。 local.settings.json将照常发布到Azure应用程序设置。

应用程序设置在这里:

enter image description here

enter image description here

用于设置的代码应如下所示:

var config = new ConfigurationBuilder()
    .AddEnvironmentVariables()
    .Build();
string conn1 = config["xxxxxxxxxxxxx"];
string conn2 = config["xxxxxxxxxxxxx"];

或者简单地

Environment.GetEnvironmentVariable("xxxxxxxxxxxxx");

此外,

我注意到您在代码中使用Console.WriteLine()。请注意,索引Console.WriteLine()不会显示在门户上。您需要使用log.LogInformation()来显示信息。

原始答案:

对于Azure Function,许多事情都可以在本地运行。但是,在部署到Azure时,需要注意很多事情。

您使用消费计划吗?还是您没有设置时区?这两个原因都将导致此问题。

看看这个Offcial doc

答案 1 :(得分:1)

如果您已经在appsettings中配置了存储帐户,我的第一条建议是将您的Console方法更改为ILogger方法,因为Console.WriteLine无法在日志控制台中写入日志使用log.LogInformation

第二,如果您更改了方法,但是天蓝色仍然无法输出任何日志,请转到Kudu网站检查日志文件,在那里您可以获得详细的文件。

文件位置应为D:\home\LogFiles\Application\Functions\Host,检查最新的日志文件。

答案 2 :(得分:0)

在您的Azure函数配置设置中,确保添加了“ AzureWebJobsStorage”,并且它指向azure存储帐户连接字符串

enter image description here