Запуск длительной фоновой задачи из запроса OData/Web API, выполняемого в Службе приложений Azure (.NET Framework).C#

Место общения программистов C#
Anonymous
Запуск длительной фоновой задачи из запроса OData/Web API, выполняемого в Службе приложений Azure (.NET Framework).

Сообщение Anonymous »

У нас есть довольно ресурсоемкий OData/Web API, написанный на C# и работающий на экземпляре службы приложений Azure. Выполнение некоторых конкретных конечных точек, которые используются редко, может занять много времени (20 секунд) или очень много времени (10 минут) в зависимости от запроса. В этом случае нам хотелось бы иметь какой-то механизм фоновых задач для выполнения такого рода задач, в идеале заголовок, который мы можем прикрепить к любому вызову, чтобы сообщить API о необходимости запускать его в фоновом режиме.
Мы попробовали:
  • немедленно вернуть запрос с идентификатором отслеживания, а затем запустить задачу SendAsync в HostingEnvironment.QueueBackgroundWorkItem, однако после завершения работы он выдает исключение, поскольку пытается что-то сделать с исходным веб-запросом, который уже удален.
  • Немедленно возвращает запрос с идентификатором отслеживания, а затем передает SendAsync в HostingEnvironment.QueueBackgroundWorkItem в качестве функции, однако это также вызывает ошибку при активации.
  • Немедленно возвращает запрос с идентификатором отслеживания, а затем ставит задание в Hangfire, которое будет сделайте прямой вызов в службу приложений и можете ждать столько, сколько потребуется. Однако даже при использовании внутреннего DNS у службы приложений Azure тайм-аут составляет 230 секунд, и мы никак не можем это изменить.
  • Мы также пытались запустить сам бизнес-код в другом потоке, но мы используем autofac DI, и если мы попытаемся получить новую область, она все равно закроется при возврате исходного запроса.
На подобные вопросы SO были получены ответы, которые, я думаю, к нам не применимы:
  • Выполнение самой работы в Hangfire означало бы повторное развертывание всего API, только для этих редких вызовов, а также мы не можем этого сделать, потому что наш Hangfire работает на AKS в Linux, а API — .NET Framework.
  • Использование веб-задания — аналогичная проблема, поскольку API очень сложен, и его развертывание в веб-задании кажется очень опасным, кроме того, нам придется платить за круглосуточное веб-задание.
    />
  • При использовании очереди проблема в том, что я не знаю, как мы можем взять сообщение из очереди, а затем выполнить его с помощью контроллеров odata, что нам нужно будет сделать для заполнения различных контекстов и последующего получения данных из БД, которые нам нужны для этого запроса.
  • Использование IHostedService — наш API — .NET Framework, а не .NET Core.
В принципе, есть какие-нибудь мысли о том, как мы можем добиться этого, выполняя веб-запрос odata столько времени, сколько необходимо, после того как мы вернем идентификатор отслеживания клиенту (мы понимаем риски), без необходимости повторного развертывания нашего API?

Вернуться в «C#»