У меня есть следующее действие загрузки файла в моем контроллере, где я загружаю текстовый файл для импорта в базу данных. Этот API-интерфейс занимает очень много времени, когда размер моего файла превышает 10MB . Поэтому я хочу изменить эту функцию импорта на запланированную службу, которая будет запускать 5 сек после загрузки и входа в базу данных. Я хочу запустить это расписание только после успешного сохранения в каталоге.
Я успешно сделал это, используя rabbitmq, но это добавляет дополнительные сложности, потому что каждый раз, когда я меняю модели, мне также нужно обновлять в клиентском приложении rabbitmq.
Есть ли способ, которым я могу использоватьвнедрение зависимостей и регистрация службы расписаний для выполнения операций с базой данных из этого API, любая помощь приветствуется?
[HttpPost("Upload")]
[ProducesResponseType(200)]
[ProducesResponseType(400)]
public async Task<IActionResult> Upload([FromForm] IFormFile file)
{
if (file == null) return BadRequest("file cannot be nulled");
if (file.Length == 0) return BadRequest("file is empty");
if (file.Length > _fileSetting.MaxBytes) return BadRequest($"Max File Size in Bytes({_fileSetting.MaxBytes}) exceeded, Current File Size is {file.Length}");
if (string.IsNullOrWhiteSpace(_env.WebRootPath))
{
_env.WebRootPath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot");
}
var uploadFolderPath = Path.Combine(_env.WebRootPath, "uploads");
if (!Directory.Exists(uploadFolderPath)) Directory.CreateDirectory(uploadFolderPath);
var fileName = DateTime.Now.ToString("ddMMyyyyHHmmss");
var filePath = Path.Combine(uploadFolderPath, fileName);
using (var stream = new FileStream(filePath, FileMode.Create))
{
await file.CopyToAsync(stream);
}
// I want to put this three lines in scheduled task.
var rows = await ImportUserHelper.ReadAllLinesAsync(filePath);
var users = ImportUserHelper.ConvertStringArrayToUsers(rows);
var result = await _userService.SaveRangeAsync(users, DateTime.Now, true);
//-----------------------------
return Ok(result);
}