特定环境下文件下载返回ERR_HTTP2_PROTOCOL_ERROR问题求助
大文件下载触发
ERR_HTTP2_PROTOCOL_ERROR问题解决思路 优先排查:.NET Core 3.1 Kestrel HTTP2参数配置
.NET Core 3.1版本Kestrel默认的HTTP2流控制窗口、最大帧大小配置针对高延迟跨区域场景适配不足,大文件传输时很容易出现流窗口耗尽触发协议中断,你可以在Program.cs/Startup.cs中添加如下配置:
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseKestrel(options => { // 连接窗口升级到128MB,默认值为128KB options.Limits.Http2.InitialConnectionWindowSize = 1024 * 1024 * 128; // 流窗口升级到64MB,默认值为96KB options.Limits.Http2.InitialStreamWindowSize = 1024 * 1024 * 64; // 最大帧调整到16MB,默认值为16KB options.Limits.Http2.MaxFrameSize = 16 * 1024 * 1024; }); webBuilder.UseStartup<Startup>(); });
第二排查点:显式设置响应的Content-Length头
流返回大文件时如果没有显式指定Content-Length,部分HTTP2客户端会将分块传输的流识别为不完整响应,触发协议错误,你可以在返回FileResult前先获取文件总大小,赋值到响应头:
var fileInfo = new FileInfo(filePath); Response.Headers.Add("Content-Length", fileInfo.Length.ToString()); return File(stream, "application/octet-stream", fileName);
第三排查点:本地Service Fabric前置代理的HTTP2配置
- 检查本地部署环境中Service Fabric前置的负载均衡、反向代理(如Application Gateway、NGINX、Traefik等)的HTTP2超时配置,将请求超时、传输超时调整到大于大文件最大传输所需的时长
- 关闭反向代理对大文件下载请求的响应缓冲功能,避免缓冲区溢出触发连接重置
- 如果不需要强制HTTP2支持,可以临时在反向代理层禁用大文件下载接口的HTTP2协议,强制走HTTP/1.1验证问题是否解决
第四排查点:关闭大文件下载接口的响应压缩
如果下载的文件已经是压缩格式(zip、7z、图片、视频等),服务端的响应压缩(gzip/brotli)不仅不会提升传输效率,还会在高抖动网络下导致HTTP2帧校验失败触发错误,你可以在中间件配置中排除大文件下载接口的压缩规则,或者在响应头添加Content-Encoding: identity强制不压缩。
快速验证方案
如果需要快速定位问题,可以先在Angular请求头中添加Connection: close强制请求走HTTP/1.1,验证是否可以正常下载,如果可以则100%为HTTP2配置相关问题,再按上面的步骤逐一排查即可。
内容的提问来源于stack exchange,提问作者Bharat Sisode
相关产品推荐
相关产品推荐

