Продолжить работать со Scoped после завершения http запроса (после возврата OK200)
Всем привет, мой очередной смешной вопрос:
Мне нужно вернуть 200, тк vk очень ждет ответ, либо снова отправляет мне запрос, тк таймаут выходит.
А потом я должен выполнять свою логику. В ней почти все сервисы Scoped, которые будут разрушены после завершения запроса.
[HttpPost]
public IActionResult Callback([FromBody] dynamic data)
{
switch (data["type"].ToString())
{
case "message_new":
{
var dataJson = data["object"]["message"].ToString();
MessageModel messageData = data["object"].ToObject<MessageModel>();
Task.Run(async () =>
{
await _VKSenderService.Process(messageData);
});
break;
}
case "message_event":
{
break;
}
}
return Ok("ok");
}
Возьмем к примеру MyDbContext: Поскольку мое приложение это бот в вк, то контекст должен быть для всех свой.(Иначе я так понимаю будут проблемы при нескольких запросах одновременно) Но он разрушен раньше, чем я им воспользуюсь.
public async Task Process(MessageModel message)
{
int _id = message.Message.FromId.HasValue ? (int)message.Message.FromId : 0;
string prompt = message.Message.Text ?? "";
var entity = await _dbContext.Entity.FindAsync(_id); // -- будет исключение если DbContext Scoped. И все будет ок, если Singlton.
if (entity != null)
{
string _messageError = $"? Подождите ответа, или отмените текущий запрос";
SendMessage(_id, _messageError);
}
else
{
}
return;
}
Более того, этот метод тоже вызывается внутри Scoped сервиса.
Мне нужно в другом потоке еще раз создать объекты или чего?
Task.Run(async () =>
{
using (var scope = _serviceProvider.CreateScope())
{
var myScopedService = scope.ServiceProvider.GetRequiredService<MyScopedService>();
await myScopedService.DoSomethingAsync();
}
});
Как-то так? Или вообще все не так?) Спасибо как обычно всем кто откликнулся