如何使 FileStreamResult 在生成数据时对其进行流式处理
本文关键字:处理 FileStreamResult 何使 数据 | 更新日期: 2023-09-27 17:56:41
在我的 ASP.NET 应用程序中,我有一个相当长的运行操作,返回FileStreamResult
.结果的数据是动态构建的 - 它不是缓存的东西。我预计"下载"会立即开始,但看起来必须首先发出整个流。
我看到这一点是因为我创建了一个类 Stream
的"只读"后代,该后代具有返回true
CanRead
、所有其他返回false
的CanX
属性以及除抛出NotImplementedException
之外的所有其他Read()
。其余的如下:
public class TestStream : System.IO.Stream {
// other stuff omitted
public override int Read(byte[] buffer, int offset, int count)
{
callCount ++;
if( callCount > 25 ) {
return 0;
}
System.Threading.Thread.Sleep( 1000 );
return count;
}
int callCount = 0;
}
此流的用法如下:
ActionResult Blah()
{
var stream = new TestStream();
return File( stream, "application/octet-stream" );
}
我希望当在浏览器中请求 URL 时,它会立即开始下载,然后以相当不流畅的方式前进,直到下载所有数据。
相反,它会挂起大约 25 秒,所有数据都会到达。
我做错了什么?我是否需要此答案中描述的流式传输部分内容的内容,或者可以做得更简单?
只是一个快速评论,您正在从操作结果中返回一个文件,您不应该返回一个 FileStreamResult 吗?我假设返回一个文件会强制你的客户端在下载之前查询 ContentLength,直到 Read 调用返回不是 0 的内容,否则该长度将不可用