【问题标题】:How to speed up file download on site hosted in Azure如何加快在 Azure 中托管的站点上的文件下载
【发布时间】:2021-06-08 15:21:05
【问题描述】:

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

文件保存在 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;

关于如何优化这个有什么建议吗?

【问题讨论】:

  • 您是否考虑将文件存储在 blob 存储而不是数据库中(只需将 blob URL 存储在数据库中)?这将是推荐的方法。
  • @GauravMantri,这似乎是个好主意,将对此进行更多研究。
  • 请注意,将内容移动到 blob 的另一个好处是您可以提供参考链接并在没有任何中介(例如您的网络应用程序)提供流式传输的情况下进行下载(消除节流点和减少应用服务的负载)。我发布了一个答案here,对此进行了更多讨论(是的,它已经有将近 6 年的历史了,但除了 SDK 代码本身之外,答案仍然有效,因为 SDK 多年来一直在发展)。

标签: c# azure asp.net-core azure-web-app-service


【解决方案1】:

我不知道那个附件存储库是什么,但很明显,您将整个文件加载到内存中,然后将其作为操作结果发送回。单独的内存复制量,不包括 GC 压力和 I/O,应该会提示您这样做绝对是错误的。

您想要做的是打开一个Stream 到您的文件,然后返回一个FileStreamResult,它将在数据从 I/O 可用时直接复制到客户端,而无需在服务器。

【讨论】:

  • 文件当前存储在数据库中,Azure 不支持 FileStream 数据类型。所以不幸的是,我不能在不改变文件存储方式的情况下使用 FileStreamResult。但是您是正确的,文件首先被读入内存,这不是一个好主意。
  • 我不相信任何可以让您将整个文件加载到其中的数据库(即任何现代数据库)都没有流式传输机制。事实上,通过谷歌快速搜索发现this,这句话靠近顶部:Create a console application to copy a file of BLOB data to SQL Azure from the command line without having to load the whole BLOB into memory.
  • 还有一位来自 SO:stackoverflow.com/questions/64388123/…。注意FileStreamResult 的用法。
  • 我认为你是对的!我要检查更多
猜你喜欢
  • 1970-01-01
  • 2018-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多