簡體   English   中英

Azure 函數應用程序:部署時 TimerTrigger 不觸發

[英]Azure Function App: TimerTrigger not Firing when Deployed

我有一個 Azure Function App (v2),它通過 TimerTrigger(每天午夜 - EST)運行。 當我在 Visual Studio 中本地運行它時,它工作正常。 但是,當我使用內置的 Visual Studio 發布工具將其直接發布到我的函數應用程序 (Zip 部署) 時,它不會在午夜或任何時間觸發。

我還嘗試直接通過 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屬性是假的,但這並不能解釋為什么當我按下門戶中的Run按鈕時它不起作用。

更新:

對於您的情況,請注意 Azure 上沒有local.settings.json文件。 local.settings.json將照常發布到 Azure 應用程序設置。

應用程序設置在這里:

在此處輸入圖片說明

在此處輸入圖片說明

你用來獲取設置的代碼應該是這樣的:

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 時需要注意很多事情。

你使用消費計划嗎? 或者你沒有設置時區? 這兩個原因都會導致這個問題。

看看這個官方文檔

如果您已經在 appsettings 中配置了存儲帳戶,我的第一個建議是將您的Console方法更改為ILogger方法,因為Console.WriteLine無法在日志控制台中寫入日志,因此首先使用log.LogInformation

其次,如果你改變了方法,azure還是無法輸出任何日志,請到Kudu站點查看日志文件,在那里你可以得到一個詳細的文件。

文件位置應該是D:\\home\\LogFiles\\Application\\Functions\\Host ,檢查最新的日志文件。

在 Azure 功能配置設置中,確保添加了“AzureWebJobsStorage”並且它指向 azure 存儲帳戶連接字符串

在此處輸入圖片說明

就我而言,設置很好,但問題出在計時器方法中,我返回了一些響應而不是使其無效。

正確的:

[FunctionName("function-name")]
public async Task RunAsync([TimerTrigger("%ConfigurationSetting%")] TimerInfo myTimer, ILogger log)

不正確:

[FunctionName("function-name")]
public async Task<Response> RunAsync([TimerTrigger("%ConfigurationSetting%")] TimerInfo myTimer, ILogger log)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM