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");
}
请注意,无需处理 fileStream
; File
方法会处理这个问题。
澄清一下:
当传入 FileStream
时,它的内容被分块读取(匹配配置的缓冲区大小)。
具体来说,这意味着它的 Read
方法 (int Read (byte[] array, int offset, int count)
) 被重复执行,直到所有字节都被读取,确保内存中存储的字节数不超过给定数量。
所以可扩展性是在较少的内存使用中,因为内存是一种资源,如果文件的大小很大,特别是与高读取频率(这个文件或其他文件)结合使用时,内存可能会承受压力
这可能会导致内存不足问题。
这是更新的问题,我的代码中曾经有一个错误
我希望能够将数据块发送到客户端。
我们将不胜感激。
有没有办法让 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");
}
请注意,无需处理 fileStream
; File
方法会处理这个问题。
澄清一下:
当传入 FileStream
时,它的内容被分块读取(匹配配置的缓冲区大小)。
具体来说,这意味着它的 Read
方法 (int Read (byte[] array, int offset, int count)
) 被重复执行,直到所有字节都被读取,确保内存中存储的字节数不超过给定数量。
所以可扩展性是在较少的内存使用中,因为内存是一种资源,如果文件的大小很大,特别是与高读取频率(这个文件或其他文件)结合使用时,内存可能会承受压力 这可能会导致内存不足问题。