ASP NET CORE долгие запросы API

Как выполнять долгие запросы к API? В планировщике задач есть задача которая выполняется раз в сутки(запрос по uri api). При переходе на этот uri сервер начинает обновлять данные в бд(примерно 10сек на один не изменённый элемент(не надо перезаписывать), таких элементов примерно 30, но со временем их количество будет увеличиваться). После ~120 секунд все перестает работать и в ответе планировщика из-за долгого времени ожидания.


Ответы (1 шт):

Автор решения: aepot

Можно через заголовок HTTP retry-after общаться с клиентом, чтобы он выполнял поллинг статуса запроса через какой-то нужный серверу промежуток времени. А отвечать на то что данные приняты надо сразу, и не ждать когда они будут полностью обработаны.

К примеру клиенту можно вернуть что-то типа

{
    "QueryId" : 12345,
    "Message": "Запрос принят."
}

Далее клиент делает запрос в /queryStatus/12345 и получает ответ

{
    "Status": "Pending",
    "Message": "Выполняется...",
    "Progress": 0.35
}

И уже в ответе пусть будет заголовок retry-after со значением времени, через какой промежуток запрос следует повторить. Клиент может подчиниться, может нет, но это хороший инструмент регулировать периодичность запросов от "честных" клиентов со стороны сервера, чтобы не перенагружать его.

Клиент повторяет запрос несколько раз и потом получает ответ

{
    "Status": "Success",
    "Message": "Запрос выполнен.",
    "Progress": 1
}

Или

{
    "Status": "Error",
    "Message": "Ошибка при запросе.",
    "Progress": 0
}

Здесь есть вопросы типа "сколько времени хранить данные о результатах запроса?", но это решаемо.

Само собой это только рекомендация реализации в рамках Web API. Но я бы пошел копать в сторону WebSocket/SignalR, чтобы держать постоянную двухстороннюю связь с клиентом, тогда ему вообще не приходилось заниматься поллингом.

→ Ссылка