#c# #.net #azure #azure-functions
#c# #.net #лазурь #azure-функции
Вопрос:
У меня есть консольное приложение, которое я хочу преобразовать в приложение для запуска таймера функции Azure, которое будет запускаться каждый час после завершения обработки и загрузки некоторых данных. Обработка и загрузка данных выполняются с помощью классов, которые вводятся в файл program.cs консольного приложения. Где-то в классах у меня есть задача.задержка на 1 час, когда он будет запрашивать новые данные после того, как данные были запрошены и загружены в первый раз. Итак, я скопировал весь код консольного приложения с его пакетами в приложение запуска таймера функции Azure. Что я пытаюсь сделать, так это сначала запустить файл program.cs консольного приложения в приложении функций azure, чтобы выполнить свою работу (обработка данных, запрос данных, загрузка данных в azure…). а затем запустить триггер таймера. Это выполнимо ? Какую строку кода я могу добавить в метод запуска приложения функции azure, чтобы сначала выполнить файл program.cs, а затем запустить триггер. Здесь вы можете найти код запуска приложения azure function time trigger.
using System; using Microsoft.Azure.WebJobs; using Microsoft.Extensions.Logging; namespace ExportServiceFunctionApp { public static class ExportServiceFunctionApp { [FunctionName("ExportServiceFunctionApp")] public static void Run([TimerTrigger("0 0 */1 * * * ")]TimerInfo myTimer, ILogger log) { log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}"); } } }
Комментарии:
1. Привет @Aboudi и добро пожаловать в Stackoverflow! Не могли бы вы, пожалуйста, отредактировать свой вопрос и добавить туда код вместо изображения? Это облегчит нам быстрое редактирование и предоставление ответа.
2. @JustShadow Я отредактировал свой вопрос. Спасибо. Просто по поводу вашего вопроса. Почему я должен использовать httptrigger. Как он узнает, как выполнить файл program.cs, потому что основной метод не указан в коде. Обратите внимание, что я все еще запускаю его локально. Как я могу вызвать основной метод в этом http-триггере. Это не может быть названо само по себе
3. Функции Azure нельзя вызывать сами по себе. Они ждут спускового крючка. И для этого существуют разные триггеры. В случае использования HttpTrigger функция Azure предоставит обычную конечную точку, чтобы вы могли вызывать их с помощью обычных вызовов http GET/POST/… Что касается основного метода, переместите код вашего основного метода консольного приложения в метод «Выполнить» здесь. И тогда вы сможете использовать решения, упомянутые в ответах ниже.
4. @JustShadow Могу ли я использовать триггер времени только без использования httptrigger. Итак, я сделал то, что добавил код основного метода в метод run функции Azure. Когда я нажал F5, он начал работать, однако это дало мне исключение, связанное с application insights. Но давайте просто проигнорируем исключение, которое на самом деле работало без httptrigger ?
5. Конечно, вы можете использовать только timertrigger, но в этом случае после нажатия клавиши F5 вам нужно будет дождаться подходящего времени, указанного в коде («0 0 */1 * * *»). Он не сработает, как только вы нажмете клавишу F5
Ответ №1:
Для достижения этой цели существует несколько решений.
Решение 1. Временно замените триггер таймера триггером http
Во время отладки приложения мы просто комментируем первую строку исходной Run
функции и добавляем вместо нее http-триггер, как это:
public static async Task Run([HttpTrigger] Microsoft.AspNetCore.Http.HttpRequest req, ILogger log) // public static async Task Run([TimerTrigger("0 0 * * * *")] TimerInfo myTimer, ILogger log) { // YOUR REGULAR CODE HERE }
Затем при запуске приложения вы увидите конечную точку, подобную этой:
Просто откройте конечную точку в браузере (или почтальоне), и функция будет вызвана.
И прямо перед отправкой кода в репозиторий просто верните исходную Run
функцию и удалите функцию http-триггера.
Решение 2. Добавьте еще один http-триггер, который вызывает функцию таймера
Добавьте в свое приложение следующую функцию, чтобы предоставить доступ к триггеру http.
[FunctionName("Test")] public static async Task Test([HttpTrigger] Microsoft.AspNetCore.Http.HttpRequest req, ILogger log) { Run(null, log); }
Функция в основном вызывает Run
функцию. Поэтому, когда вы запустите приложение, вы снова получите конечную точку с консоли, которую можно использовать в браузере для запуска функции. URL-адрес будет выглядеть следующим образом:
http://localhost:7071/api/Test
Комментарии:
1. Спасибо вам за ваш ответ. Позвольте мне прояснить мой вопрос. У меня есть в обозревателе решений мое приложение-функция. Внутри него я скопировал весь код для консольного приложения. Консольное приложение запускается из файла program.cs. Где-то в коде я говорю программе подождать 1 час, а затем начать снова. Поэтому сначала мне нужно запустить файл program.cs в функции azure. Мой вопрос здесь в том, как я могу позволить ему сработать до срабатывания триггера. Какой код я должен добавить, чтобы вызвать его, и в качестве заключительного шага я должен запустить расписание
2. Вы можете добавить код, упомянутый в «Решении 2», в свой код, а затем после запуска приложения откройте следующее в своем браузере, чтобы запустить функцию
http://localhost:7071/api/Test
3. Как работает этот триггер таймера. Вы упомянули, что если таймер был установлен на 1 час, и я нажму f5, он запустится через 1 час. В моем случае я хочу, чтобы основной метод запустился в первый раз, как только он завершит свою работу, триггер таймера задержится на 1 час, и по истечении этого часа основной метод должен запуститься снова. Я хочу, чтобы это было рекурсивно, как будто это никогда не закончится. Пример: Во-первых, сначала запускается основной метод, затем задержки запуска таймера на 1 час, затем основной метод запускается снова, затем задержки запуска таймера на 1 час и т. Д. (Никогда не останавливается), так как он будет развернут в azure…
4. К сожалению, Azure не предоставляет такую функциональность, чтобы автоматически запускать код, как только вы нажмете клавишу F5 при локальной разработке. Вы должны использовать триггеры, но ни один из них не предоставляет такой возможности.
Ответ №2:
Функции Azure по своей природе зависят от событий. Если триггер функции означает обработанное событие.
Метод запуска функции означает, что функция сработала, и ее точка входа для нее.
Если вам нужна какая-либо обработка или выполнение кода перед этим, вам, возможно, потребуется написать еще одну функцию и выполнить шаги, а затем запустить другую функцию либо триггера таймера, либо другого типа.
Комментарии:
1. Какую функцию я должен использовать перед запуском таймера, чтобы запустить файл program.cs ? Файл program.cs содержит всю информацию для извлечения данных из базы данных, запроса к ней и загрузки в azure. Мой вопрос здесь в том, как я могу это сделать ? Как я могу сначала запустить файл program.cs в функции azure, а затем вызвать триггер таймера. Какую строку кода мне следует добавить ?