#c# #asp.net-core-mvc #asp.net-core-webapi
#c# #asp.net-core-mvc #asp.net-core-webapi
Вопрос:
Я пытаюсь реализовать функцию поиска с использованием фоновой задачи в очереди, но у меня проблема с возвратом значения задачи в очереди.
У меня есть следующие 2 API:
- SearchUserAsync(параметр SearchParameter)
- GetSearchResultAsync (идентификатор int)
SearchUserAsync API регистрирует фоновую задачу в очереди, которая будет выполнять поиск пользователя use на основе параметра SearchParameter, но в то же время он вернет HTTP 202 (принятый), который указывает, что запрос был принят с URL GetSearchResultAsync API с идентификатором задачи в очереди в заголовке ответа («Местоположение»), чтобы получить результат позже.
Затем клиент вызывает GetSearchResultAsync API с идентификатором (возможно, идентификатором поставленной в очередь задачи) и получает результат операции поиска, если операция была выполнена.
Теперь мне трудно понять, как назначить идентификатор поставленной в очередь задаче и как сохранить результат поставленной в очередь задачи, чтобы я мог получить к нему доступ позже, когда вызывается GetSearchResultAsync API.
Я пытался разобраться в документации по следующим ссылкам, но не смог уловить общую концепцию.
- https://learn.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-2.2
- https://learn.microsoft.com/en-us/dotnet/standard/microservices-architecture/multi-container-microservice-net-applications/background-tasks-with-ihostedservice
- https://github.com/aspnet/Extensions/issues/805
Любая помощь была бы оценена.
Заранее спасибо.
Комментарии:
1. Предполагая, что вы можете успешно поставить задачу в фоновую очередь, вам нужно сгенерировать идентификатор GUID, который вы 1) возвращаете клиенту и 2) используете в качестве ключа для результата операции после ее выполнения. Фоновая задача по завершении может добавить идентификатор GUID (как ключ) и результат (как значение) в структуру словаря (возможно, в память или в какое-либо постоянное хранилище). Другая конечная точка просто попытается извлечь это значение (на основе идентификатора GUID, который отправляет клиент) из структуры, где хранятся все результаты.
2. Не рекомендовал бы делать это, не зная точно, что произойдет, когда все начнется. Попробуйте использовать что-то вроде hangfire