C# 如何在Azure托管的站点上加速文件下载
我有一个为客户编写的客户业务应用程序。这是一个客户跟踪应用程序,涉及上传和下载客户相关文件 这些文件保存在SQL Server中。对于比meg小的小文件,它可以正常工作。但是当文件变大时,下载文件所需的时间就会越来越慢,直到抛出异常为止。有时会下载一个25兆的大容量,但有时会超时 今天,客户端无法下载5个meg文件,因为它在大约60秒后超时 当我将应用程序从我的开发机器运行到同一个数据库时,文件将在大约10秒钟内下载。因此,在我看来,问题不在于数据库,而在于AppService宿主 当我查看Azure上AppService的日志时,它显示了下载这些文件时CPU的最大值 该网站目前的S1计划是75美元,下一个计划是每月150美元,这对于一个低使用率的网站来说似乎非常昂贵。它只供3-4个人使用。除了这些大文件下载,速度非常快 代码相当简单:C# 如何在Azure托管的站点上加速文件下载,c#,azure,asp.net-core,azure-web-app-service,C#,Azure,Asp.net Core,Azure Web App Service,我有一个为客户编写的客户业务应用程序。这是一个客户跟踪应用程序,涉及上传和下载客户相关文件 这些文件保存在SQL Server中。对于比meg小的小文件,它可以正常工作。但是当文件变大时,下载文件所需的时间就会越来越慢,直到抛出异常为止。有时会下载一个25兆的大容量,但有时会超时 今天,客户端无法下载5个meg文件,因为它在大约60秒后超时 当我将应用程序从我的开发机器运行到同一个数据库时,文件将在大约10秒钟内下载。因此,在我看来,问题不在于数据库,而在于AppService宿主 当我查看Az
var file = await this._attachmentRepository.GetFileAsync(id);
FileContentResult result = new FileContentResult(file.Content, file.ContentType)
{
FileDownloadName = file.FileName
};
return result;
有没有关于如何优化此文件的建议?我不知道附件存储库是什么,但很明显,在将整个文件作为操作结果发送回之前,您正在将其加载到内存中。仅内存复制的数量,不包括GC压力和I/O,应该会提示您这绝对是错误的
相反,您要做的是打开文件的
流
,然后返回FileStreamResult
,当数据从I/O可用时,它将直接复制到客户端,而无需在服务器上分配大量内存。您考虑过将文件存储在blob存储中而不是数据库中吗(只需将blob URL存储在数据库中)?这将是推荐的方法。@GauravMantri,这似乎是个好主意,将对此进行更多研究。请注意,将内容移动到blob的另一个好处是,您可以提供一个参考链接,并在无需任何中介(如您的web应用程序)的情况下进行下载提供流媒体服务(消除节流点并减少应用程序服务的负载)。我发布了一个答案,更多地讨论了这一点(是的,它已经有近6年的历史了,但答案仍然有效,除了SDK代码本身,因为SDK已经发展了多年)。文件当前存储在数据库中,Azure不支持FileStream数据类型。因此,不幸的是,我无法在不更改文件存储方式的情况下使用FileStreamResult。但您是正确的,首先将文件读入内存不是一个好主意。我不相信任何数据库允许您加载整个fil(任何现代数据库)没有流媒体机制。事实上,谷歌快速搜索发现了这一点,顶部有一句话:创建一个控制台应用程序,从命令行将BLOB数据文件复制到SQL Azure,而无需将整个BLOB加载到内存。
还有一个来自SO的:。注意FileStreamResult
用法。我认为你是正确的!我将查看更多信息,请参见下面的问题: