Я использую . NET Core 3.1 . Я хочу передать файл из базы данных клиенту, используя NpgsqlLargeObjectStream
. У меня есть следующий код:
1-й ПОДХОД
public IActionResult Download(int id)
{
using (var transaction = _dbContext.Database.BeginTransaction())
{
using (NpgsqlLargeObjectStream stream = _dbContext.GetLargeObjectStream(1))
{
return new FileStreamResult(stream, new MediaTypeHeaderValue("application/octet-stream"))
{
FileDownloadName = "test.txt"
};
}
}
}
Если я запускаю этот код, я получаю следующее исключение:
InvalidOperationException: Object disposed
Npgsql.NpgsqlLargeObjectStream.CheckDisposed()
Однако, если я прочитал весь поток в память, а затем вернул его, все работает нормально.
2-Й ПОДХОД
public IActionResult Download(int id)
{
using (var transaction = _dbContext.Database.BeginTransaction())
{
using (NpgsqlLargeObjectStream stream = _dbContext.GetLargeObjectStream(1))
{
stream.Position = 0;
byte[] buffer = new byte[stream.Length];
for (int totalBytesCopied = 0; totalBytesCopied < stream.Length;)
totalBytesCopied += stream.Read(buffer, totalBytesCopied, Convert.ToInt32(stream.Length) - totalBytesCopied);
return File(buffer, "application/octet-stream", "test.txt");
}
}
}
Что вызывает эту проблему? Ясно, что я могу читать поток, и он не утилизируется (как видно из 2-го подхода). Как я могу отладить, что идет не так?