#c# #azure-webjobs
Вопрос:
В настоящее время я испытываю трудности с выполнением длинного HTTP-запроса в веб-задании. То же приложение работает нормально при запуске на локальном компьютере. Поскольку я перепробовал несколько способов заставить это работать, мне теперь любопытно, возможно ли это вообще.
Мой тестовый код ниже:
static void Main(string[] args)
{
/// [...]Getting configuration and using it in "SendPayload"
_stopwatch = new Stopwatch();
_stopwatch.Start();
Task.Run(async () => { await SendPayloadAndAwait(configuration); });
while (_isWaiting)
{
if (_stopwatch.ElapsedMilliseconds % 5000 == 0)
{
Console.WriteLine(".");
}
}
}
public static async Task<string> SendPayloadAndAwait (RequestModel targetRequest)
{
/// [...]Preparing client and payload
Console.WriteLine("Start");
Response= curClient.SendAsync(req).Resu<
var endContent = Response.Content.ReadAsStringAsync().Resu<
Console.WriteLine("End");
_isWaiting = false;
return "Done";
}
«Конец» никогда не печатается в консоли веб-заданий, это бесконечный (вплоть до тайм-аута) цикл «.». Такой сценарий каким-то образом запрещен?
Комментарии:
1. Веб-приложения Azure по умолчанию переходят в спящий режим после периода бездействия. Настроено ли ваше веб-приложение, содержащее это веб-задание, на «Всегда включенное»?
2. @mehmetseckin мое рассуждение состояло в том, что, поскольку существует постоянный вывод, веб-приложение «останется в живых» для этого процесса. Будет ли достаточно изменить службу приложений на Всегда включенную, или работа также должна быть непрерывной?
3. Согласно этой заметке , время ожидания веб-приложения истекает после 20 минут бездействия, и только запросы к фактическому веб-приложению сбрасывают этот таймер. Веб-задания выполняются асинхронно в отдельном процессе, поэтому они не заставляют веб-приложение «бодрствовать».
4. @mehmetseckin Я переключился на «Всегда включен», а также попытался снова, когда задание было установлено как непрерывное, но в обоих случаях HTTP-запрос, похоже, выполняется бесконечно. В данном конкретном случае я ожидаю ответа не более чем через 6-7 минут, так что даже эта 20-минутная отметка должна быть больше, чем нужно.
Ответ №1:
То, как я решил в предыдущей компании, заключалось в том, что у меня была длительная работа в веб-API, которая была реализована как функция Azure, было
- Первый вызов (т. е. /api/StartJob)
- создает запись о задании (в таблице azure)
- запускает фоновую нить
- возвращает статус 202 [Принято] с идентификатором записей о заданиях
- Фоновый поток выполняет длительную задачу, обновляя запись задания по мере ее выполнения
- Цикл клиента (в процентах от выполненного
- Статус запросов (т. е. /api/Статус задания)
- Если процент выполнения = 100, завершите цикл
- Статус запросов (т. е. /api/Статус задания)
Это было очень успешно и надежно при условии, что у нас был оплаченный план
Бесплатные планы завершают сеанс примерно через 5 минут (по замыслу).
Ответ №2:
Вам нужно будет включить параметр «Всегда включено», чтобы убедиться, что ваша длительная работа не будет прекращена.
Время ожидания веб-приложения истекает после 20 минут бездействия, и только запросы к фактическому веб-приложению сбрасывают этот таймер. Веб-задания выполняются асинхронно в отдельном процессе, поэтому они не заставляют веб-приложение «бодрствовать».
Вот примечание из документации по веб — заданиям:
Веб-приложение может выйти из строя после 20 минут бездействия. и только запросы к реальному веб-приложению могут сбросить таймер. Просмотр конфигурации приложения на портале Azure или отправка запросов на сайт расширенных инструментов (
https://<app_name>.scm.azurewebsites.net
) не приводит к сбросу таймера. Если вы настроили свое веб-приложение на непрерывный или запланированный запуск (таймер-триггер) Веб-задания, включите параметр Всегда включено на странице конфигурации Azure вашего веб-приложения, чтобы обеспечить надежную работу веб-заданий. Эта функция доступна только на Базовом, Стандартном и Премиальном уровнях ценообразования.
Комментарии:
1. Я переключился на «Всегда включено», а также повторил попытку, установив задание как непрерывное, но в обоих случаях HTTP-запрос, похоже, выполняется бесконечно. В данном конкретном случае я ожидаю ответа не более чем через 6-7 минут, так что даже эта 20-минутная отметка должна быть больше, чем нужно. Я проведу еще один тест, переведя все на синхронное выполнение, чтобы определить, является ли это проблемой задачи или проблемой с самим запросом.
2. Веб — задание, выполняемое полностью синхронно, отправка запроса никогда не завершается в веб-задании-независимо от настроек «Всегда включено» и «Запущено»/»Непрерывно». Я очень смущен этим, потому что не вижу причины, по которой это не сработает. Консоль веб-заданий не возвращает никаких ошибок, и код по-прежнему работает при локальном выполнении.
3. После дальнейших исследований я наткнулся на эту тему — похоже, что для HTTP-запросов время ожидания еще меньше-230 секунд, и оно не настраивается. Рекомендуется либо перейти на виртуальную машину, либо реализовать какой-то асинхронный шаблон.