В моем проекте . 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
?