TaskCanceledException при загрузке больших файлов в AWS S3 - PullRequest
0 голосов
/ 16 сентября 2018

Я пытаюсь загрузить большой видеофайл (800 МБ) в мое хранилище S3, но время ожидания истекло. Он отлично работает для небольших файлов. Мой проект является приложением ASP.Net Core 2.1.

Это исключение, которое выдается:

Произошло необработанное исключение при обработке запроса. SocketException: операция ввода-вывода была прервана из-за выхода из потока или запроса приложения. Неизвестное место

IOException: невозможно прочитать данные из транспортного соединения. Операция ввода-вывода была прервана из-за выхода из потока или запроса приложения. System.Net.Sockets.Socket + AwaitableSocketAsyncEventArgs.ThrowException (ошибка SocketError)

TaskCanceledException: операция была отменена. GamerPilot.Video.AWSS3Helper.UploadFileAsync (Поток потока, строковый ключ, acl S3CannedACL, bool useReducedRedundancy, bool throwOnError, CancellationToken cancellationToken) в AWSS3Helper.cs, строка 770

Мой исходный код выглядит так:

  public async Task<IVideo> AddVideoAsync(int instructorId, int lectureId, string videoName, string filePath, CancellationToken cancellationToken = default(CancellationToken))
    {
        if (string.IsNullOrEmpty(filePath)) { throw new ArgumentNullException("filePath", "Video filepath is missing"); }
        if (!File.Exists(filePath)) { throw new ArgumentNullException("filePath", "Video filepath does not exists"); }

        //Test video file upload and db row insertion
        using (var stream = File.OpenRead(filePath))
        {
            return await AddVideoAsync(instructorId, lectureId, videoName, stream, cancellationToken);
        }
    }

 public async Task<IVideo> AddVideoAsync(int instructorId, int lectureId, string videoName, Stream videoFile, CancellationToken cancellationToken = default(CancellationToken))
    {
        var video = (Video) await GamerPilot.Video.Helper.Create(_awsS3AccessKey, _awsS3SecretKey, _awsS3BucketName, _awsS3Region)
            .AddVideoAsync(instructorId, lectureId, videoName, videoFile, cancellationToken);

        using (var db = new DbContext(_connectionString))
        {
            db.Videos.Add(video);
            var count = await db.SaveChangesAsync();
        }

        return video;
    }`

 public async Task<IVideo> AddVideoAsync(int instructorId, int lectureId, string videoName, Stream videoFile, CancellationToken cancellationToken = default(CancellationToken))
    {
        if (string.IsNullOrEmpty(videoName)) { throw new ArgumentNullException("videoName", "Video name cannot be empty or null"); }
        if (videoFile == null) { throw new ArgumentNullException("video", "Video stream is missing"); }

        var videoNameCleaned = videoName.Replace(" ", "-").ToLower().Replace(".mp4", "");
        var videoKey = string.Join('/', "videos", instructorId, lectureId, videoNameCleaned + ".mp4");

        using (var aws = new AWSS3Helper(_awsS3AccessKey, _awsS3SecretKey, _awsS3BucketName, _awsS3Region))
        {
            try
            {
                //THIS FAILS ------
                await aws.UploadFileAsync(videoFile, videoKey, Amazon.S3.S3CannedACL.PublicRead, true, true, cancellationToken);

            }
            catch (Exception ex)
            {

                throw;
            }
        }

        return new Video
        {
            InstructorId = instructorId,
            LectureId = lectureId,
            Name = videoName,
            S3Key = videoKey,
            S3Region = _awsS3Region.SystemName,
            S3Bucket = _awsS3BucketName,
            Created = DateTime.Now
        };
    }

Как я могу обойти это?

1 Ответ

0 голосов
/ 17 сентября 2018

Нет никаких общих ограничений на сам S3, которые бы препятствовали загрузке файла размером 800 МБ. Однако при работе с AWS существуют требования к обработке повторов и тайм-аутов. Из вашего вопроса не ясно, используете ли вы Amazon SDK (я не могу найти источник GamerPilot.Video.AWSS3Helper.UploadFileAsync). Однако Amazon SDK для .NET должен обработать это для вас, если вы используете его в соответствии со следующим:

Программирование с помощью AWS SDK для .NET - повторные попытки и тайм-ауты

Использование AWS SDK для .NET для многоэтапной загрузки (API высокого уровня)

...