Количество байтов, скопированных из файла в поток, не равно нулю - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь скопировать файл из amazon s3 в поток памяти, чтобы я мог передать его как файл для загрузки.

Я получаю файл из amazon s3, однако, когда я пытаюсьчтобы скопировать поток, я получаю нулевое значение.

Я проверил, закрывается ли поток перед копированием и нет.

var ms = new MemoryStream();
try
{
    GetObjectRequest getObjectRequest = new GetObjectRequest();
    getObjectRequest.BucketName = Bucketname;
    getObjectRequest.Key = Keyname;

    var getObjectResponse = client.GetObjectAsync(getObjectRequest);
    getObjectResponse.Wait();
    getObjectResponse.Result.ResponseStream.CopyToAsync(ms);
    var len = ms.Length;

    return File(ms.ToArray(), System.Net.Mime.MediaTypeNames.Application.Pdf, "filename");
}

Также

var len = ms.Length; 

дает значение 18.

Итак, почему не читается контент?Пожалуйста, направьте меня в правильном направлении.

Ответы [ 3 ]

0 голосов
/ 26 ноября 2018

Используйте await для вашего GetObjectAsync метода, как показано ниже, а также для CopyToAsync в качестве ответа @Camilo:

try
{
    GetObjectRequest getObjectRequest = new GetObjectRequest();
    getObjectRequest.BucketName = Bucketname;
    getObjectRequest.Key = Keyname;

    var getObjectResponse = await client.GetObjectAsync(getObjectRequest);
    getObjectResponse.Wait();
    await getObjectResponse.Result.ResponseStream.CopyToAsync(ms);
    var len = ms.Length; 
    return File(ms.ToArray(), System.Net.Mime.MediaTypeNames.Application.Pdf, "filename");
} 

или вы можете сделать что-то вроде:

static async Task ReadStream()
{ 
    try
    {
        GetObjectRequest request = new GetObjectRequest
        {
            BucketName = bucketName,
            Key = keyName
        };
        using (GetObjectResponse response = await client.GetObjectAsync(getObjectRequest))
        using (Stream responseStream = response.ResponseStream)
        using (MemoryStream reader = new MemoryStream(responseStream))
        {
            //your codes
        }
    }
    catch (AmazonS3Exception e)
    {
        //Handle it
    }
    catch (Exception e)
    {
        //Handle it
    }
}

responseStream - это ваш поток контента, а потребление - что-то вроде:

ReadStream().Wait();
0 голосов
/ 26 ноября 2018

Вам нужно дождаться возвращения асинхронного режима.Если ваш метод не помечен как асинхронный и вы не хотите помечать его как таковой, вы можете сделать следующее:

var ms = Task.Run<byte>(async () => await getObjectResponse.Result.ResponseStream.CopyToAsync(ms)).Result;

Это выполнит асинхронный метод и будет ожидать возврата.Вам также не нужно помечать вашу функцию как асинхронную.

0 голосов
/ 26 ноября 2018

Ваша проблема прямо здесь:

getObjectResponse.Result.ResponseStream.CopyToAsync(ms);

Кто ждет, когда это Task закончится?Никто, так что вы возвращаетесь в середине операции.

В целом, код должен быть:

try
{
    GetObjectRequest getObjectRequest = new GetObjectRequest();
    getObjectRequest.BucketName = Bucketname;
    getObjectRequest.Key = Keyname;

    var getObjectResponse = await client.GetObjectAsync(getObjectRequest);
    await getObjectResponse.ResponseStream.CopyToAsync(ms);
    var len = ms.Length;

    return File(ms.ToArray(), System.Net.Mime.MediaTypeNames.Application.Pdf, "filename");
}

Обратите внимание на правильное использование await для асинхронных операций, что вы должныиспользовать, особенно в веб-фреймворке, как ASP.NET Core.

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