如何使 FileStreamResult 在生成数据时对其进行流式处理

本文关键字:处理 FileStreamResult 何使 数据 | 更新日期: 2023-09-27 17:56:41

在我的 ASP.NET 应用程序中,我有一个相当长的运行操作,返回FileStreamResult .结果的数据是动态构建的 - 它不是缓存的东西。我预计"下载"会立即开始,但看起来必须首先发出整个流。

我看到这一点是因为我创建了一个类 Stream 的"只读"后代,该后代具有返回true CanRead、所有其他返回falseCanX属性以及除抛出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 在生成数据时对其进行流式处理

只是一个快速评论,您正在从操作结果中返回一个文件,您不应该返回一个 FileStreamResult 吗?我假设返回一个文件会强制你的客户端在下载之前查询 ContentLength,直到 Read 调用返回不是 0 的内容,否则该长度将不可用