Исключение объекта при возврате файла - PullRequest
0 голосов
/ 29 апреля 2020

В моем проекте . NET Core 3.1 есть следующий код. Моя цель - избежать загрузки файла в ОЗУ с помощью потоков.

public IActionResult Download(int id)
{
    using (var transaction = _dbContext.Database.BeginTransaction())
    {
        using (NpgsqlLargeObjectStream stream = _dbContext.GetLargeObjectStream(id))
        {
            // 1st method - works
            using (MemoryStream ms = new MemoryStream())
            {
                stream.CopyTo(ms);
                return File(ms.ToArray(), "application/octet-stream", "test.txt");
            }

            // 2nd method - doesn't work 
            //return File(stream, "application/octet-stream", "test.txt");
        }
    }
}

public NpgsqlLargeObjectStream GetLargeObjectStream(int oid)
{
    Database.OpenConnection();
    var manager = new NpgsqlLargeObjectManager(Database.GetDbConnection() as NpgsqlConnection);
    return manager.OpenRead(Convert.ToUInt32(oid));
}

Если я использую первый метод , все работает нормально и файл загружается. Мне не нравится этот подход, так как файл сначала загружается в оперативную память. Это не работает, если файлы большие (1 ГБ +).

Если я использую второй метод , я получаю следующее исключение:

InvalidOperationException: Object disposed
Npgsql.NpgsqlLargeObjectStream.CheckDisposed()

Что такое Я делаю не так? Кроме того, как я могу зафиксировать транзакцию после того, как поток был успешно прочитан до конца return File?

...