Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在Azure托管的站点上加速文件下载_C#_Azure_Asp.net Core_Azure Web App Service - Fatal编程技术网

C# 如何在Azure托管的站点上加速文件下载

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

我有一个为客户编写的客户业务应用程序。这是一个客户跟踪应用程序,涉及上传和下载客户相关文件

这些文件保存在SQL Server中。对于比meg小的小文件,它可以正常工作。但是当文件变大时,下载文件所需的时间就会越来越慢,直到抛出异常为止。有时会下载一个25兆的大容量,但有时会超时

今天,客户端无法下载5个meg文件,因为它在大约60秒后超时

当我将应用程序从我的开发机器运行到同一个数据库时,文件将在大约10秒钟内下载。因此,在我看来,问题不在于数据库,而在于AppService宿主

当我查看Azure上AppService的日志时,它显示了下载这些文件时CPU的最大值

该网站目前的S1计划是75美元,下一个计划是每月150美元,这对于一个低使用率的网站来说似乎非常昂贵。它只供3-4个人使用。除了这些大文件下载,速度非常快

代码相当简单:

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
用法。我认为你是正确的!我将查看更多信息,请参见下面的问题: