Функция таймера Azure C # (.NET) не выполняется по расписанию или вручную

#azure #azure-functions #azure-app-service-plans

#azure #azure-функции #планы azure-app-service-plans

Вопрос:

У меня есть функция Azure с запуском таймера. Расписание "*/6 * * * *" (выполняется каждые шесть минут). Я не могу запустить ее вручную, и она не запускается автоматически. Ниже мой function.json :

 {
  "generatedBy": "Microsoft.NET.Sdk.Functions-1.0.31",
  "configurationSource": "attributes",
  "bindings": [
    {
      "type": "timerTrigger",
      "schedule": "%TimerTriggerPeriod%",
      "useMonitor": true,
      "runOnStartup": false,
      "name": "myTimer"
    }
  ],
  "disabled": false,
  "scriptFile": "../bin/AccessChangeMonitoring.dll",
  "entryPoint": "Microsoft.IT.Security.AccessChangeMonitoring.AccessChangeMonitoring.InitiateChangeMonitoring"
}
  

%TimerTriggerPeriod% определено в моем local.settings.json файле ( "TimerTriggerPeriod": "0 */6 * * * *" ). Глядя на отображение показателя количества функций приложения на панели инструментов, видно, что моя функция была выполнена 0 раз:

введите описание изображения здесь

Ниже мой host.json :

     {
      "version": "2.0",
      "logging": {
        "applicationInsights": {
          "samplingExcludedTypes": "Request",
          "samplingSettings": {
          

  "isEnabled": true
      }
    }
  },
  "functionTimeout": "00:07:00"
}
  

Ниже приведен код функции:

 [FunctionName("InitiateChangeMonitoring")]
public static async Task InitiateChangeMonitoring([TimerTrigger("%TimerTriggerPeriod%")] TimerInfo myTimer, ILogger log)
{
    log.LogInformation("Change Monitoring started.");

    // Reset the listing of app ids we need to retrieve delta role assignments for
    oneAuthZAppIds = new List<string>();
    await GetOneAuthZAppIdsAsync();

    // Create the necessary Cosmos DB infastructure
    await CreateDatabaseAsync();
    await CreateContainerAsync();
    await CreateDeltaAPICallDatabaseAsync();
    await CreateDeltaAPICallContainerAsync();

    await CreateManagerMappingDatabaseAsync();
    await CreateManagerMappingContainerAsync();

    // Compute the authentication token needed to access the PAP Service API
    log.LogInformation("nRetrieve PAPServiceAPIToken");
    string PAPServiceAPIToken = await GetTokenAsync(Environment.GetEnvironmentVariable("OneAuthZAppUri"), Environment.GetEnvironmentVariable("OneAuthZAppId"),
        PAPAuthenticationSecret);
    log.LogInformation("PAPServiceAPIToken = "   PAPServiceAPIToken);

    string GraphAPIAuthenticationToken = await GetTokenAsync(Environment.GetEnvironmentVariable("GraphAppUri"), Environment.GetEnvironmentVariable("GraphClientId"),
        graphKey);
    log.LogInformation("graphAPIAuthenticationToken = "   GraphAPIAuthenticationToken);

    await runChangeMonitoringSystemAsync(PAPServiceAPIToken);
}
  

Комментарии:

1. Возможно, ваша проблема заключается в том, что вы не настроили среду, доступную в Azure.

2. При развертывании функции Azure в Azure local.settings.json загружаться не будет. Переменная env будет взята из этого места вместо local.settings.json: i.stack.imgur.com/PrYrZ.png

3. Вы ее тестировали? На моей стороне это работает и без проблем.

Ответ №1:

Во-первых, я заметил, что вы указываете, что используете local.settings.json для сохранения переменной среды и в то же время показываете метрику в Azure.

Итак, я думаю, что первая проблема, из-за которой ваша функция Azure не может быть запущена, заключается в том, что вы не устанавливаете переменную среды в Azure.

Вы должны установить в этом месте вместо local.settings.json (потому что, когда функция развернута в Azure, она никогда не будет принимать переменную среды из local.settings.json):

введите описание изображения здесь

(Не забудьте сохранить редактирование.)

Во-вторых, как говорит Иван, ваш формат cron неверен. Формат timetrigger должен быть в этом формате:

 {second} {minute} {hour} {day} {month} {day of week}