Объект FileStreamResult расположен - PullRequest
1 голос
/ 30 апреля 2020

Я использую . 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-го подхода). Как я могу отладить, что идет не так?

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