Эффективная отправка фрагментированных данных в Multipart API в ASP.NET - PullRequest
0 голосов
/ 15 марта 2019

Я пытаюсь загрузить большой файл на AWS S3 . Итак, в проекте, над которым я работаю, мы отправляем большие файлы в виде фрагментированного процесса и следуем нижеприведенному подходу для загрузки каждой части. И когда мы получим последнюю часть, завершите загрузку и отправьте файл url.

public UploadPartResponse UploadChunk(Stream stream, string fileName, string uploadId, List<PartETag> eTags, int partNumber, bool lastPart)
{
    stream.Position = 0; // Throwing Exceptions

    //Step 1: build and send a multi upload request
    if (partNumber == 1)
    {
        var initiateRequest = new InitiateMultipartUploadRequest
        {
            BucketName = _settings.Bucket,
            Key = fileName
        };

        var initResponse = _s3Client.InitiateMultipartUpload(initiateRequest);
        uploadId = initResponse.UploadId;
    }

    //Step 2: upload each chunk (this is run for every chunk unlike the other steps which are run once)
    var uploadRequest = new UploadPartRequest
                        {
                            BucketName = _settings.Bucket,
                            Key = fileName,
                            UploadId = uploadId,
                            PartNumber = partNumber,
                            InputStream = stream,
                            IsLastPart = lastPart,
                            PartSize = stream.Length // Throwing Exceptions
                        };

    var response = _s3Client.UploadPart(uploadRequest);

    //Step 3: build and send the multipart complete request
    if (lastPart)
    {
        eTags.Add(new PartETag
        {
            PartNumber = partNumber,
            ETag = response.ETag
        });

        var completeRequest = new CompleteMultipartUploadRequest
        {
            BucketName = _settings.Bucket,
            Key = fileName,
            UploadId = uploadId,
            PartETags = eTags
        };

        try
        {
            _s3Client.CompleteMultipartUpload(completeRequest);
        }
        catch
        {
            //do some logging and return null response
            return null;
        }
    }

    response.ResponseMetadata.Metadata["uploadid"] = uploadRequest.UploadId;
    return response;
}

Сначала я пытался отправить 1MB порций данных за один раз в службу WCF. Но Multipart API не поддерживает данные детали менее чем 5MB , за исключением последней части. Так что я должен отправить 5MB данных для каждого чанка. В результате я увидел, что это замедляет процесс полной загрузки на моем локальном компьютере.

Замедляется ли при отправке 5MB фрагментированных данных в каждом запросе, а не 1MB фрагментированных данных? Или это хорошо, чтобы отправить больше данных в одном запросе и будет быстрее, когда я буду размещать службу WCF?

Любая помощь будет принята с благодарностью. Заранее спасибо.

...