asp.net - 通过 IIS 与静态节点服务的 ASP.NET Web API 流速度
问题描述
我正在为一个允许用户下载相当大的文件(如 1 GB 或更大)的应用程序进行性能改进。我做了一个非常简单的例子,它只从存储中获取一个文件并通过 StreamContent 返回它:
var fileStream = System.IO.File.Open(@"C:\files\1GB.bin", FileMode.Open,
FileAccess.Read);
var response = Request.CreateResponse(HttpStatusCode.OK);
response.Headers.AcceptRanges.Add("bytes");
var content = new StreamContent(fileStream, BufferSize);
response.Content = content;
按照 ASP.NET Web API 2 中的建议使用 BufferSize - StreamContent 非常慢有助于提高性能。但是,将这种下载方法与简单的 Node 静态服务器(我使用的是https://www.npmjs.com/package/serve)进行比较,下载速度存在很大差异。
考虑到以下因素,我想了解可能是什么原因:
- 测试在一个网络中完成,下载文件的机器与运行服务器的机器在同一个网络中
- 服务通过 http 访问 IP 地址,如http://172.12.22.4,网站通过 URL https://www.testenv.com/api/getfile访问
- 文件相同,存放在另一台机器的网络文件夹中,网络相同
- 性能差异是几倍(文件通过 Web API 以每秒约 80-90 MB/s 的速度下载,通过服务以 240-270 MB/s 的速度下载)
- 在服务器运行的同一台机器上(即本地)通过https://www.testenv.com/api/getfile下载文件时,速度更高(~150 MB/s 但仍低于使用 Node 服务器通过网络)
- IIS 服务器上运行着多个 IIS 网站,它们使用绑定重定向实现了不同的 URL
因此,导致性能差异的原因真的很有趣。是否可以使用绑定重定向、https 或公共 URL 而不是 IP 地址?有趣的是,即使通过 IIS 进行本地下载仍然比通过 Node serve 进行网络下载要慢。
测试下载是在内存或磁盘上完成的,结果大致相同。
解决方案
推荐阅读
- javascript - Individual column searching filter for js sourced data using DataTable.js
- magento2 - 我们找不到符合选择的产品。megento 2中的错误
- java - 如何以正确的顺序将 LinkedHasMap 值转换为 ArrayList/Array?
- php - 如何使用php在表格中显示低于同一日期的出勤率?
- mysql - 从 mysql 到 HDFS 或 Hive 表的数据实时更新(CDC 方法)
- list - 如何使特定列表值(tcl)
- python - 使用 sed、awk、perl 等删除 N 个匹配模式
- php - 如何创建用于连接数据库的索引文件
- .htaccess - 使用 htaccess 在每个 URL 的末尾添加“?XDEBUG_PROFILE=on”
- javascript - 如何通过单击父