• 1000 * написана функция, которая запускается автоматически и вызывает другой API, который дополнительно обрабатывает этот файл и записывает какие-то SQL запросы, и после обработки файла он генерирует некоторые данные, а затем я sh этот сгенерированный файл снова в blob в какой-то другой контейнер. Но я сталкиваюсь с одной проблемой, если я загружаю один файл, он отлично работает для меня, но когда я загружаю один файл, а затем я загружаю другой файл, мой второй файл отменяет мою первую обработку данных, а во втором контейнере я получаю только один экспортированный файл, который для второго загруженного файла. Поэтому я хочу, чтобы как можно больше пользователей могли загружать файл, но все процессы должны запускаться, он не должен сбрасывать ни один запущенный процесс. Если вы, ребята, предложите мне любой подход, который будет мне полезен. Я поделюсь своим кодом, если это необходимо
Конечная точка загрузки файла
[HttpPost]
[Route("uploadFileToBlob")]
public async Task<IActionResult> UploadFileToBlobStorage(IFormFile file)
{
var userId = HttpContext.User.Identity.Name;
var accessToken = Request.Headers[HeaderNames.Authorization];
_manageClaim.UploadExcelToBlob(file, accessToken, userId);
return Ok(new { Message = "Your file is uploaded and processing..."});
}
Репозиторий этой конечной точки
public void UploadExcelToBlob(IFormFile file, string accessToken, string userId)
{
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(blobConnectionString);
// Create the blob client.
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
// Retrieve reference to a previously created container.
CloudBlobContainer container = blobClient.GetContainerReference("infolder");
// Retrieve reference to a blob named "test.xlsx"
CloudBlockBlob blockBlobReference = container.GetBlockBlobReference(file.FileName);
container.Metadata.Clear();
container.Metadata.Add("bearerToken", accessToken);
container.SetMetadata();
Stream myBlob = file.OpenReadStream();
blockBlobReference.UploadFromStream(myBlob);
var currentUser = _automationUsers.GetUserById(int.Parse(userId));
BatchClaimStatus batchClaim = new BatchClaimStatus()
{
UserId = int.Parse(userId),
UserName = currentUser.FirstName + ' ' + currentUser.LastName,
InputFileName = file.FileName,
IsExported = false,
ErrorMessage = null,
OutputFileName = null,
UpdatedDate = DateTime.Now,
UploadedDate = DateTime.Now
};
_blobRepository.AddImportedFileToDb(batchClaim);
}
Конечная точка API Эта конечная точка попадает автоматически, когда я загружаю любой файл из моего пользовательского интерфейса
[HttpPost]
[Route("getBatchClaimData")]
public async Task<IActionResult> ExportToCsv(List<CsvPropModel> model)
{
await _manageClaim.GetClaimData(model);
return Ok();
}
Это репозиторий вышеприведенной конечной точки
public async Task<bool> GetClaimData(List<CsvPropModel> csvProps)
{
var dataRange = new List<ClaimsResponse>();
ClaimsResponse claims = new ClaimsResponse();
foreach (var item in csvProps)
{
InvoiceResult invoice = _manage.GetInvoiceDetailsByInvoiceId(item.InvoiceId, item.NickName);
EligiblePaymentStatusParameters eligibleParams = Converter.ConvertInvoiceToEligibleParams(invoice);
claims = await GetClaimDetails(eligibleParams, invoice);
claims.InvKey = invoice.InvKey;
claims.NickName = invoice.NickName;
claims.InvoiceNumber = invoice.InvNbrDisplay;
dataRange.Add(claims);
}
var csvRecord = ClaimDataHelper.ConvertToCsvReCord(dataRange);
var fileName = @$"{ DateTime.Now.ToShortDateString() }_ExportedBatchClaim_{ DateTime.Now.ToShortTimeString() }.csv";
MemoryStream ms = new MemoryStream();
using (var memoryStream = new MemoryStream())
{
using (var writer = new StreamWriter(memoryStream))
{
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
{
csv.WriteRecords(csvRecord);
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(blobConnectionString);
// Create the blob client.
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
// Retrieve reference to a previously created container.
CloudBlobContainer container = blobClient.GetContainerReference("outfolder");
// Retrieve reference to a blob named "test.xlsx"
CloudBlockBlob blockBlobReference = container.GetBlockBlobReference(fileName);
memoryStream.Position = 0;
memoryStream.CopyTo(ms);
ms.Position = 0;
await blockBlobReference.UploadFromStreamAsync(ms);
ms.Flush();
var importedData = _blobRepository.GetLastImportedData();
BatchClaimStatus batchClaim = new BatchClaimStatus()
{
ErrorMessage = null,
InputFileName = importedData.InputFileName,
IsExported = true,
OutputFileName = fileName,
UpdatedDate = DateTime.Now,
UploadedDate = importedData.UploadedDate,
UserId = importedData.UserId,
UserName = importedData.UserName
};
_blobRepository.UpdateExportedFileToDb(batchClaim, importedData.Id);
}
}
}
return true;
}