【发布时间】:2020-04-30 06:11:30
【问题描述】:
我正在使用 .NET Core 3.1。我想使用NpgsqlLargeObjectStream 将文件从数据库流式传输到客户端。我有以下代码:
第一种方法
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()
但是,如果我将整个流读入内存然后返回,一切正常。
第二种方法
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");
}
}
}
是什么导致了这个问题?显然我可以读取流并且它没有被处理(如第二种方法所示)。如何调试问题所在?
【问题讨论】:
-
FileStreamResult是命令模式的一部分:直到 您的Download操作返回后才会执行。自然,这意味着using在FileStreamResult尝试将其推送到响应之前清理了Stream。FileStreamResult将在完成后为您处理Stream,但这无助于处理transaction。
标签: c# asp.net-core stream