ASP.NET 核心流 - 将块写入请求

ASP.NET Core streaming - write chunks to a request

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

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

我们将不胜感激。

有没有办法让 asp.net 核心更多地控制数据流式传输。

我担心下面的代码如何扩展。

有人可以建议如何在 asp.net 核心中通过网络 api 传输数据吗?

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

是否可以检索数据块并将它们写入请求,只将数据块放入内存。这样我就可以下载非常大的文件了。

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

作为社区 Wiki 发布,因为它在技术上没有回答问题,但建议的代码不能用作评论。

您可以 return 直接来自 FileResult 的流,因此无需手动从中读取。事实上,您的代码实际上并没有 "stream",因为您基本上是将整个流读入内存,然后在最后 returning byte[]。相反,只需执行:

using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
{
    return File(fileStream, "audio/mpeg");
}

或者更简单,只是 return 文件路径,让 FileResult 完全处理它:

return File(System.IO.File.OpenRead(filePath), "audio/mpeg");

应用 FileStream 方法 - 如前所述 - 使用 FileStream constructor 接受 bufferSize 参数,该参数指定读入内存的字节数.
(您可以否决默认值 (4096) 以适应您的环境。)

public FileStream(string path, FileMode mode, FileAccess access, FileShare share, int bufferSize);

bufferSize:
A positive System.Int32 value greater than 0 indicating the buffer size.
The default buffer size is 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");
}

请注意,无需处理 fileStreamFile 方法会处理这个问题。


澄清一下:

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

所以可扩展性是在较少的内存使用中,因为内存是一种资源,如果文件的大小很大,特别是与高读取频率(这个文件或其他文件)结合使用时,内存可能会承受压力 这可能会导致内存不足问题。