Как запустить api для множественных запросов в. net core - PullRequest
0 голосов
/ 12 июля 2020
• 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;
        }

1 Ответ

0 голосов
/ 22 июля 2020

Я не вижу никаких проблем как таковых в приведенном выше коде, которые могут вызвать это, хотя вы всегда должны пытаться выполнить любую операцию с привязкой к вводу-выводу, например _blobRepository.UpdateExportedFileToDb(batchClaim, importedData.Id) или _manageClaim.UploadExcelToBlob(file, accessToken, userId) asyn c, чтобы улучшить параллелизм.

Фактическая проблема, похоже, связана с Azure Триггером большого двоичного объекта функции. Иногда вы можете столкнуться с проблемами в триггере большого двоичного объекта (особенно для плана использования функций), например, при бездействии, отсутствии триггера или задержке обработки очереди.

Для сценария с высокой пропускной способностью, скоростью и надежностью рекомендуется использовать Триггер EventGrid для функции, если вы используете хранилище V2. Вы можете обратиться к здесь для получения более подробной информации и к этому примеру .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...