[英]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
,檢查最新的日志文件。
就我而言,設置很好,但問題出在計時器方法中,我返回了一些響應而不是使其無效。
正確的:
[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.