【发布时间】:2023-01-03 19:58:56
【问题描述】:
我正在使用 .net6 在 C# 中创建服务器端 Web API 端点。端点将文件从磁盘流式传输到 HTTP 响应中。流式传输整个文件后,我想计算下载速度并将其报告到其他地方。在 Windows 上,这按预期工作 - 下载注册在浏览器中接收到整个文件后执行。但是在 Linux 上,我的代码在下载开始后几分之一秒内到达“RegisterDownload”逻辑。下载在浏览器中继续进行,但服务器代码似乎已完成流式传输。看起来服务器将 HTTP 通信传递给其他组件,或者流式数据缓存在网络上的某个地方(?)。
我的代码如下所示:
var start = DateTime.UtcNow;
HttpContext.Features.Get<IHttpResponseBodyFeature>().DisableBuffering();
await Response.SendFileAsync(getFileResponse.filepath, startBytes, bytesToSend, cancelToken);
_logger.LogDebug($"Sending completed after {(_dateTime.UtcNow - start):g} - cancel is {cancelToken.IsCancellationRequested}");
var elapsed = DateTime.UtcNow.Subtract(start);
await RegisterDownload(elapsed);
在浏览器中用了大约 5 秒下载了 50MB 后,我得到了这个日志输出:
Sending completed after 0:00:00.08602 - cancel is False
我也尝试过(没有成功):
- 分块扫描文件(从 FileStream 读取到 1MB 缓冲区然后将每个块发送到
Response.Body.WriteAsync的循环) - 在循环内和循环完成后添加
await Response.FlushAsync - 更大的文件 (1GB)
【问题讨论】:
标签: c# .net linux asp.net-web-api .net-6.0