ASP.NET Core возвращает HTTP-ответ и продолжает работу фонового работника в том же контексте - PullRequest
0 голосов
/ 30 апреля 2019

Извините, заблаговременно, это немного длинная настройка / вопрос.В настоящее время я работаю над API с использованием C # ASP.NET Core 2.1.У меня есть конечная точка POST, выполнение которой занимает около 5-10 секунд (что нормально).Мне нужно добавить функциональность, выполнение которой может занять много времени.Мое текущее нагрузочное тестирование занимает дополнительные 3 минуты.Честно говоря, производство может занять немного больше времени, потому что я не могу получить хороший ответ относительно того, сколько из этих вещей мы можем ожидать обработать.С точки зрения UX недопустимо ждать так долго, так как внешний интерфейс ожидает результатов существующего запроса POST.Чтобы поддерживать приемлемый UX.

Все службы настроены как временные, используя контейнер ASP.NET Core DI по умолчанию.Это приложение использует EF Core и настроено так же, как и службы (извините, я сейчас не на работе и забыл точное слово в файле установки).

Сначала я попытался просто создать фонового работника, но после того, как ответ был отправлен клиенту, внутренние объекты начали бы удаляться (т. Е. Контекст БД сущности), и это в конечном итоге приводило бы к ошибкам при продолжении попытки выполнитькод с использованием указанного контекста (что имеет смысл, поскольку они были удалены).

Мне удалось заставить фонового работника в основном работать, используя внедренный IServiceScopeFactory (реализация по умолчанию ASP.NET Core).Весь мой код выполняется успешно, пока я не попытаюсь сохранить в БД.Мы переопределили метод SaveChangesAsync (), чтобы он автоматически обновлял свойства CreatedByName, CreatedTimestamp, updatedByName и updatedTimestamp, соответственно, на отслеживаемые в настоящее время сущности.Так как эта логика используется объектом, созданным из IServiceScopeFactory, кажется, что он не использует один и тот же HttpContext и, следовательно, не обновляет CreatedByName и updatedByName правильно (пытается установить для них значение null, но столбец DB не принимает значение null),

Прямо перед тем, как я ушел с работы, я создал что-то, что, казалось, работало, но казалось очень грязным.Вместо того чтобы использовать IServiceScopeFactory в фоновом режиме для создания новой области, я создал олицетворенный запрос, используя объект WebClient, который указывает на конечную точку в том же API, который выполнялся в настоящее время.Это позволило своевременно отправить ответ клиенту, и это продолжало выполнять новые функции на сервере (корректно обновляя мои сущности).

Я извиняюсь, в настоящее время я не на работеи не может предоставить примеры кода в данный момент, но если это потребуется для полного ответа на этот пост, я добавлю некоторые позже.

В идеале, я хотел бы иметь возможность запустить мой запрос, обработатьлогики в существующем POST, отправьте ответ обратно клиенту и продолжите выполнение новой функциональности, используя тот же контекст (включая HttpContext, который содержит идентификационную информацию).У меня вопрос, можно ли это сделать без создания олицетворенного запроса?Можно ли это сделать с помощью фонового работника, использующего тот же контекст, что и исходный поток (я знаю, что это звучит немного странно)?Это их другой подход, который я полностью пропускаю?Спасибо заранее.

1 Ответ

0 голосов
/ 30 апреля 2019

Посмотрите на Hangfire довольно простая в использовании библиотека для фоновых задач.

...