ASP.NET Core 流 - 将块写入请求

pan*_*ohn 5 c# rest request filestream asp.net-core

这是更新的问题,我的代码中曾经有一个错误

我希望能够将数据块发送给客户端。

任何事情都会受到赞赏。

有没有办法为 ASP.NET 核心提供更多控制它如何流式传输数据的方法。

我很担心下面的代码是如何缩放的。

有人可以建议如何通过asp.net core中的web api流式传输数据吗?

提供的答案和下面的代码有效。我不确定它是如何扩展的?

是否可以检索数据块并将它们写入请求,只需将数据块放入内存中。所以我将能够下载非常大的文件。

using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
{
    return File(System.IO.File.OpenRead(filePath), "audio/mpeg");
}
Run Code Online (Sandbox Code Playgroud)

pfx*_*pfx 5

应用该FileStream方法 - 正如已经提到的 - 使用接受参数的FileStream 构造函数bufferSize,该参数指定读入内存的字节数。
(您可以否决默认值 ( 4096) 以适合您的环境。)

public FileStream(string path, FileMode mode, FileAccess access, FileShare share, int bufferSize);
Run Code Online (Sandbox Code Playgroud)

bufferSize
大于 0 的正 System.Int32 值,指示缓冲区大小。
默认缓冲区大小为 4096。

public IActionResult GetFile()
{ 
    var filePath = @"c:\temp\file.mpg"; // Your path to the audio file.
    var bufferSize = 1024;
    var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize);            
    return File(fileStream, "audio/mpeg");
}
Run Code Online (Sandbox Code Playgroud)

请注意,无需处置fileStream; 该File方法可以解决这个问题。


澄清:

当传入 a 时FileStream,它的内容将以块的形式读取(与配置的缓冲区大小匹配)。
具体来说,这意味着它的Read方法( int Read (byte[] array, int offset, int count))会重复执行,直到读取完所有字节为止,确保内存中存储的字节数不超过给定数量。

因此,可扩展性是在内存使用量较少的情况下进行的,因为如果文件大小很大,内存是一种可能会面临压力的资源,特别是与(此文件或其他文件的)高读取频率相结合,这可能会导致记忆问题。