繁体   English   中英

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

[英]ASP.NET Core streaming - write chunks to a request

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

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

任何事情都会受到赞赏。

有没有办法为 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");
}

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

public FileStream(string path, FileMode mode, FileAccess access, FileShare share, int 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");
}

请注意,无需处理fileStream File方法负责解决这个问题。


澄清:

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

因此,可扩展性在较少的内存使用范围内,因为如果文件的大小很大,内存是一种可能会受到压力的资源,特别是结合高读取频率(此文件或其他文件)可能会导致超出记忆问题。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM